在Swift 2.2中,“Generic”对“Equatable”协议的冗余一致性。

13

编译时Equatable出错了。 我想在列表中添加find或contains方法来检查值。 我的代码如下

class Generic: NSObject, Equatable, NSCoding //Am Having an error -  Redundant conformance of 'Generic' to protocol 'Equatable'

{

  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
}

发生了错误,是因为我正在使用NSCoding和NSObject吗?


4
在Swift2中,NSObject已经实现了Equatable协议,因此您可以删除该协议声明:https://dev59.com/CWAf5IYBdhLWcg3wmztL#34515270 - Thilo
2个回答

30

继承 NSObject 的类已经符合 Equatable 协议,因此声明 Object: Equatable 是多余的。

然而,符合协议并不意味着它已经被正确实现了(NSObject 只检查指针是否相同)。如果你想为 NSObject 正确实现 Equatable,只需排除协议符合语句 (: Equatable),但仍需实现比较方法:

static func ==(lhs: Object, rhs: Object) -> Bool {
   return lhs.text == rhs.text
}

2
我能否覆盖isEqual()而不是static func ==,并仍然使用==进行比较? - Eddie
@Eddie 是的,已在 Playground 中测试过了。 - kgaidis

16
根据文档NSObject符合Equatable:

符合以下协议
CVarArgType
CustomDebugStringConvertible
CustomStringConvertible
Equatable
Hashable
NSObjectProtocol

因此,就像您的错误所说,符合 Equatable 是多余的......


1
已经修复了错误,但没有使用Contains方法进行检查? 做如下代码...如果!readArray.contains(generic) { readArray.append(generic) }我在这里做错了吗? - dhaval shah
已经添加了另一个调用。Swift 2.2的contains方法不起作用。 - dhaval shah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接