【问题标题】:Swift 2.2, Contains Method not workingSwift 2.2,包含方法不起作用
【发布时间】:2016-09-20 08:51:06
【问题描述】:

包含的方法无法正常工作,即使它与 Object 匹配,它也会给我错误的结果?

下面是我的代码

class Generic: NSObject, NSCoding
{

  var genericCode: String?
  var genericName : String?
  var genericType : String?
  var genericImageUrl : String?
  var genericPhone: String?
  var orgName : String?

  override init()
  {

    self.genericCode = String("")
    self.genericName = String("")
    self.genericType = String("")
    self.genericImageUrl = String("")
    self.genericPhone = String("")
    self.orgName = String("")

  }

  //Parameterzed Constructor for the Generic
  init(genericCode: String , genericName: String , genericPhone: String, genericType: String, genericImageUrl : String)
  {
    self.genericCode = genericCode
    self.genericName = genericName
    self.genericType = genericType
    self.genericImageUrl = genericImageUrl
    self.genericPhone = genericPhone

  }

  required init(coder aDecoder: NSCoder) {
    genericCode = aDecoder.decodeObjectForKey("genericCode") as? String
    genericName = aDecoder.decodeObjectForKey("genericName") as? String
    genericType = aDecoder.decodeObjectForKey("genericType") as? String
    genericPhone = aDecoder.decodeObjectForKey("genericPhone") as? String
  }

  func encodeWithCoder(aCoder: NSCoder) {
    aCoder.encodeObject(genericCode, forKey: "genericCode")
    aCoder.encodeObject(genericName, forKey: "genericName")
    aCoder.encodeObject(genericType, forKey: "genericType")
    aCoder.encodeObject(genericPhone, forKey: "genericPhone")
  }
}

func ==(lhs: Generic, rhs: Generic) -> Bool
{
  return lhs.genericCode == rhs.genericCode
}

检入 ViewController

print(readArray.contains(generic))
if !readArray.contains(generic)
{
            readArray.append(generic)
}

【问题讨论】:

标签: swift contains equatable


【解决方案1】:

选项 1

原因是你的类继承自NSObject,因此,你必须满足NSObjectProtocol而不是Equatable

override func isEqual(object: AnyObject?) -> Bool {
     if let object = object as? Generic {
         return self.genericCode == object.genericCode
     }
     return false
 }

选项 2

Equatable 继承而不是NSObject(您可能无法使用此选项,因为您似乎需要NSCoding

请注意,对于较新版本的 Swift,您可能应该使用 选项 3: 使用 Codable 而不是 NSCodable

【讨论】:

  • 这只是 isEqual 比较指针 - 如果您尝试比较具有相同 genericCode 的两个不同实例,它将不起作用(尝试在 == 重载中放置一个断点,它'永远不会被绊倒)。
  • XCode 10.1: override func isEqual(_ object: Any?) -> Bool
猜你喜欢
  • 2017-04-24
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
相关资源
最近更新 更多