[swift]CIImage 应该是 Equatable 吗?

标签: ios Swift
发布时间: 2017/3/6 23:31:05
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

因此,苹果公司的文件说, CIImage 符合 Equatable 。这并不意味着以下的单元测试会通过走然而,它不会。为什么有兴趣 !

func test_CIImageEqualityShouldWork() {
    let bundle = NSBundle(forClass: PrototypeTests.self)
    guard let path = bundle.pathForResource("testImage", ofType: "png") else { return }
    guard let image = UIImage(contentsOfFile: path) else { return }

    let thingy1 = CIImage(image: image)
    let thingy2 = CIImage(image: image)
    XCTAssert(thingy1 == thingy2)
}

图像存在, guard 语句都通过,但断言失败,他们难道不是平等。

出于兴趣,我试着创建 UIImage 两次和比较那些太。这也将失败。

解决方法 1:

所有 NSObject 子类符合 Equatable ,和 == 函数调用 isEqual: 方法的对象上。 isEqual:方法的 NSObject 只是比较的对象的指针,即 o1 == o2 认为如果 o1o2 引用相同的对象实例。

例如,见互动与objective-c Api:

Swift提供默认实现的 = = 和 = = = 运算符,并采用从 NSObject 类派生的对象可相等的议定书 》。默认实现的 = = 运算符将调用由于︰ 方法和的默认实现 = = = 运算符检查指针平等。你不应重写从目的 C.导入的类型的相等运算符或身份操作员

由于基实现︰ 提供的 NSObject 类是相当于通过指针平等身份检查。

许多 NSObject 子类重写 isEqual: 方法 (如 NSStringNSArrayNSDate ,...),但不是 CIImage :

let thingy1 = CIImage(image: image)
let thingy2 = CIImage(image: image)

创建两个不同 CIImage 实例和这些比较结果是"不平等"。

赞助商