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!
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
Comparez le point # 2 de https://stackoverflow.com/a/42286148/2976878 ainsi que https://stackoverflow.com/q/33319959/2976878 – Hamish
@vadian Vous avez totalement raison, c'est une mauvaise habitude. Merci. – Aximem