XCTAssertEqual with Optional (not Equatable)

Posted

技术标签:

【中文标题】XCTAssertEqual with Optional (not Equatable)【英文标题】: 【发布时间】:2015-01-07 08:30:39 【问题描述】:

我想在断言中做出以下声明:

XCTAssertEqual(sut.dataSource?.delegate, userInterface, "Data source's delegate should be the user interface")

属性dataSourcedelegate 是可选的。我尝试用 let 分配解开它们,但它基本上归结为任一

Generic parameter 'T' cannot be bound to non-@objc protocol type 'FetchedResultsControllerDataSourceDelegate'

Type 'FetchedResultsControllerDataSourceDelegate?' does not conform to protocol 'Equatable'

如何断言可选关系已正确设置?

【问题讨论】:

【参考方案1】:

问题是“相等”比较值。 NSFetchedResultsControllerDataSourceDelegate 不符合 Equatable 因此无法比较其值。您应该将其身份与“与=== 相同”运算符进行比较。

XCTAssertTrue(sut.dataSource?.delegate === userInterface, "Data source's delegate should be the user interface")

【讨论】:

这导致了“'FetchedResultsControllerDataSourceDelegate' 与 'AnyObject' 不同”。但我发现,我需要该协议上的 @objc 注释,然后它才能工作。有些事情对我来说仍然是个谜。非常感谢! 啊好吧..我想我明白了。我需要协议上的@objc 注释,否则我会将纯Swift 事物与来自ObjC 世界的UIViewController 进行比较,因此它们无法进行比较。对吗? @objc for protocols 表示只有类才能符合协议。因此,编译器可以安全地假设 === 可用于符合此类协议的类型的实例。

以上是关于XCTAssertEqual with Optional (not Equatable)的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 NSString 的 XCTAssertEqual 作为错误消息参数

比较单元测试中的 swift Type 值 - XCTAssertEqual vs ==

在 XCTAssertEqual 中使用 Foundation Decimal 类型

如何使用自定义对象 XCTAssertEqual NSArray?

找不到接受类型参数列表的 XCTAssertEqual 的重载 ([String : AnyObject], [String : AnyObject])

EF 默认约定和常用方法须知