2017-09-05 9 views
0

私はカスタムオブジェクトでセットを作成しようとしています。これが動作している 、私は私のカスタムの設定がまったく重複が存在しないオブジェクトを使用する場合:スイフト| 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のは、すでに私はハッシュ値を上書きする必要がハッシュ可能プロトコル(ともEquatable)を実装しているので、私は、NSObjectのと私のクラスを拡張し、これはもう機能しません。カスタムオブジェクトのセットを使用すると重複がありますが、ここで何が間違っていますか? :

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'メソッドで初期化される暗黙のアンラップされたオプションとしてプロパティを宣言します。残念なことに、多くの*恐ろしい*チュートリアルはこの恐ろしい*習慣を示唆しています。絶対にしないでください。感嘆符を削除します。 – vadian

+0

https://stackoverflow.com/a/42286148/2976878とhttps://stackoverflow.com/q/33319959/2976878の比較ポイント#2 – Hamish

+0

@vadianあなたはまったく正しい、これは悪い習慣です。ありがとう。 – Aximem

答えて

1

NSObjectはココアタイプです。 NSObjectのルールはSwiftのルールとは異なります。 NSObjectをセット内で動作させるには、hashの実装に従った実装がisEqualでなければなりません。

+0

これはisEqualとhashの実装で動作します。ありがとう – Aximem

関連する問題