2017-09-05 137 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