2017-09-05 98 views
0

我正在尝试创建一个具有自定义对象的Set。 这是工作,如果我使用一个设置我的自定义的对象不存在重复:Swift |设置NSObject

public class AttributesGroup: Hashable, Equatable, Comparable { 

    open var id: Int! 
    open var name: String! 
    open var position: Int! 

    public init (id: Int = 0, name: String = "", position: Int = 0) { 
     self.id = id 
     self.name = name 
     self.position = position 
    } 

    open var hashValue: Int { 
     get { 
      return id.hashValue 
     } 
    } 

    public static func ==(lhs: AttributesGroup, rhs: AttributesGroup) -> Bool { 
     return lhs.id == rhs.id 
    } 

    public static func < (lhs: AttributesGroup, rhs:AttributesGroup) -> Bool { 
     return lhs.position < rhs.position 
    } 
} 

我致以类NSObject的,因为NSObject中已经实现了哈希的协议(也Equatable)我要重写散列值,并且这不再起作用,如果我使用一组我的自定义对象存在重复项,那么我在这里做错了什么? :

public class AttributesGroup: NSObject, Comparable { 

    open var id: Int! 
    open var name: String! 
    open var position: Int! 

    public init (id: Int = 0, name: String = "", position: Int = 0) { 
     self.id = id 
     self.name = name 
     self.position = position 
    } 

    open override var hashValue: Int { 
     get { 
      return id.hashValue 
     } 
    } 

    public static func ==(lhs: AttributesGroup, rhs: AttributesGroup) -> Bool { 
     return lhs.id == rhs.id 
    } 

    public static func < (lhs: AttributesGroup, rhs:AttributesGroup) -> Bool { 
     return lhs.position < rhs.position 
    } 
} 

感谢您的帮助!

+0

与往常一样,**永远不会**将属性声明为包含非可选值的'init'方法中初始化的隐式unwrapped选项。不幸的是,许多可怕的教程都暗示了这种可怕的习惯。不要那样做,永远不要。删除感叹号。 – vadian

+0

比较#https://stackoverflow.com/a/42286148/2976878以及https://stackoverflow.com/q/33319959/2976878 – Hamish

+0

@vadian你是完全正确的,这是一个坏习惯。谢谢。 – Aximem

回答

1

NSObject是一种可可类型。 NSObject的规则与Swift的规则不同。为了让一个NSObject在一个集合中工作,它必须有一个与其实现hash一致的isEqual的实现。

+0

事实上,这是与isEqual和哈希的实现。谢谢 – Aximem