比较单元测试中的 swift Type 值 - XCTAssertEqual vs ==
Posted
技术标签:
【中文标题】比较单元测试中的 swift Type 值 - XCTAssertEqual vs ==【英文标题】:Comparing swift Type values in unit tests - XCTAssertEqual vs == 【发布时间】:2020-03-18 07:19:48 【问题描述】:我试图在我的单元测试中比较 swift Type 值,并注意到 XCTAssertEqual 无法编译,而与 == 比较可以正常编译。
XCTAssertEqual(MyStruct.self, MyStruct.self)
--> 编译失败,出现错误“全局函数 'XCTAssertEqual(::_:file:line:)' 要求 'MyStruct.Type' 符合 'Equatable'”
XCTAssertTrue(MyStruct.self == MyStruct.self)
--> 编译正常
我想了解这两个比较之间有什么区别。
【问题讨论】:
错误信息还不够清楚吗?MyStruct.Type
不符合 Equatable
,XCTAssertEqual
要求其参数符合该协议。
@Sweeper 不应该 == 在这种情况下也会失败吗?
【参考方案1】:
XCTAssertEqual
要求其参数符合Equatable
。 MyStruct.Type
是一种元类型,与所有元类型一样,它不符合Equatable
,因此MyStruct.self
不能用作XCTAssertEqual
的参数。
但是,==
运算符是为所有元类型定义的。这就是您可以在它们上使用==
的原因。这是here实现的“特例”。
“但是==
不是Equatable
的要求之一吗?”你可能会说。是的,但这并不意味着实现==
的类型会自动符合Equatable
。反之亦然:符合Equatable
的每个类型都必须实现==
。
【讨论】:
以上是关于比较单元测试中的 swift Type 值 - XCTAssertEqual vs ==的主要内容,如果未能解决你的问题,请参考以下文章
swift Xcode单元测试:无法将“Person”类型的值转换为预期的参数类型“Person”