【问题标题】:Compare struct with UIImage将 struct 与 UIImage 进行比较
【发布时间】:2016-11-15 16:42:32
【问题描述】:

我有下面的结构

struct Contact: Equatable {
    let name: String?
    let number: String
    let image: UIImage?
}

func ==(lhs: Contact, rhs: Contact) -> Bool {
    return lhs.name == rhs.name && lhs.number == rhs.number && lhs.image == rhs.image
}

我使用上面的函数来比较两个结构。但它无法比较图像。即使结构具有相同的图像,它也会失败。我在这里想念什么?

编辑:

根据邓肯的评论,我修改为功能

func ==(lhs: Contact, rhs: Contact) -> Bool {
    var imagesAreEqual = false
    if let lhsImage = lhs.image, let rhsImage = rhs.image {
        imagesAreEqual = lhsImage.isEqual(rhsImage)
    } else if lhs.image == nil && rhs.image == nil {
        imagesAreEqual = true
    }

    return lhs.name == rhs.name && lhs.number == rhs.number && imagesAreEqual
}

静止条件失败。

【问题讨论】:

  • 它们是否都引用了同一个 UIImage 对象?还是两个看起来完全一样的不同实例?

标签: ios swift struct uiimage


【解决方案1】:

如果您在 Xcode 中查看 UIImage 上的文档,他们会说:

isEqual(_:) 方法是唯一可靠的方法来确定是否 两张图片包含相同的图片数据。

您创建的图像对象可能彼此不同,即使 当您使用相同的缓存图像数据初始化它们时。唯一的办法 确定它们的相等性是使用 isEqual(_:) 方法,该方法 比较实际的图像数据。

所以重写您的 == 函数以使用 isEqual 来比较图像:

func ==(lhs: Contact, rhs: Contact) -> Bool {
    return lhs.name == rhs.name && 
      lhs.number == rhs.number && 
      lhs.image.isEqual(rhs.image)
}

【讨论】:

  • == 重载 NSObject 调用 isEqual(_:),所以这应该没有任何区别。
  • @Hamish,这句话是从 UIImage 上的 Swift 文档中直接引用的,它甚至给出了一个使用 if imageA == imageB 和注释“// 不正确!直接对象比较可能不起作用的例子。 "
  • @DuncanC 嗯,这确实很好奇。我的直觉是他们错误地从 UIImage 上的 Objective-C 文档中转移了它,确实正确地说使用 == 不是比较图像的可靠方法.但是you can see here Swift 重载==NSObject 只是调用isEqual(_:)(你也可以覆盖isEquals(_:) 并自己验证)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-31
  • 2013-05-04
  • 2021-04-24
  • 2019-11-28
  • 2020-12-30
  • 1970-01-01
相关资源
最近更新 更多