2017-09-05 8 views
0

J'essaie de créer un ensemble avec des objets personnalisés. Cela fonctionne, Si j'utilise un ensemble de mes objets personnalisés il n'y a pas de doublons:Swift | Définir avec 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 
    } 
} 

Je tends la classe avec NSObject, car NSObject implémente déjà protocole HASHABLE (et assimilables) Je dois passer outre valeur de hachage, et cela ne fonctionne plus, Si j'utilise un ensemble de mes objets personnalisés, il y a des doublons, qu'est-ce que je fais mal ici? :

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 
    } 
} 

Merci pour votre aide!

+0

Comme toujours, ** ne jamais déclarer ** les propriétés comme des options non implémentées implicites qui sont initialisées dans une méthode 'init' avec des valeurs non-optionnelles. Malheureusement, de nombreux tutoriels * horribles * suggèrent cette habitude * horrible *. Ne fais pas ça, jamais. Supprimez les points d'exclamation. – vadian

+0

Comparez le point # 2 de https://stackoverflow.com/a/42286148/2976878 ainsi que https://stackoverflow.com/q/33319959/2976878 – Hamish

+0

@vadian Vous avez totalement raison, c'est une mauvaise habitude. Merci. – Aximem

Répondre

1

NSObject est un type de cacao. Les règles de NSObject sont différentes de celles de Swift. Pour faire fonctionner un objet NSObject dans un ensemble, il doit avoir une implémentation de isEqual conforme à son implémentation de hash.

+0

En effet, cela fonctionne avec l'implémentation de isEqual et hash. Merci – Aximem