2015-10-10 8 views
5

Ho realizzato un piccolo parco giochi per eseguire alcuni test sulle operazioni di Set con oggetti personalizzati, ma continuano a non funzionare e non ho idea del perché.Cosa devi fare per far funzionare le operazioni sugli oggetti personalizzati?

class User: NSObject { 
    let id: String 
    init(id: String) { 
     self.id = id 
     super.init() 
    } 

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

    override var description: String { 
     get { 
      return id 
     } 
    } 
} 


func ==(lhs: User, rhs: User) -> Bool { 
    return lhs.hashValue == rhs.hashValue 
} 

Poi, feci due insiemi di User oggetti:

let user1 = User(id: "zach") 
let user2 = User(id: "john") 
let user3 = User(id: "shane") 


let user4 = User(id: "john") 
let user5 = User(id: "shane") 
let user6 = User(id: "anthony") 

let userSet1 : Set<User> = [user1, user2, user3] 
let userSet2 : Set<User> = [user4, user5, user6] 

Ma quando faccio un'operazione modo:

let newSet = userSet1.subtract(userSet2) 
print(newSet) 

newSet è identico al userSet1 e nessuno degli insiemi sono modificati.

Cosa devo fare per far funzionare queste operazioni di set?

id:zach -> 4799450060450308971 
id:john -> 4799450060152454338 
id:shane -> -4799450060637667915 
id:john -> 4799450060152454338 
id:shane -> -4799450060637667915 
id:anthony -> 4799450059843449897 
id:shane -> -4799450060637667915 
id:anthony -> 4799450059843449897 
id:john -> 4799450060152454338 
+0

Suggerimento: accedere a 'NSString (stringa: id) .integerValue' prima di restituirlo e verificare se si soddisfano correttamente i requisiti di hashability. – matt

+0

Ma secondo il mio hashValue, hanno membri in comune – shakked

+0

Ho aggiornato il calcolo 'hashValue' e ho aggiunto alcune stampe e si può vedere che alcune di esse hanno l'hashValues ​​corrispondente ma l'operazione non funziona ancora – shakked

risposta

3

Non riesci a creare la tua idea di cosa usare come valore hash. Il requisito per l'hashility è: il valore hash di due oggetti deve essere lo uguale a se questi due oggetti sono uguale a.

È stato fornito un algoritmo di valore hash ma non è stato fatto nulla per rendere equatabile l'abbinamento degli oggetti Utente.

Ecco un oggetto d'uso che è hashable in un set:

func ==(lhs:User, rhs:User) -> Bool { 
    return lhs.id == rhs.id 
} 
class User: Hashable, CustomStringConvertible { 
    let id: String 
    init(id: String) { 
     self.id = id 
    } 
    var hashValue: Int { 
     return id.hashValue 
    } 
} 

Si osservi che ho rimosso la complicazione di fare questa cosa anche NSObject. Le cose sono un po 'diverse se vuoi farlo; dovrai pensare a come funziona NSObject.

+0

Quindi cosa devo fare? – shakked

+1

Quale parte di quello che ho appena detto è misterioso? Penso di essere stato piuttosto esplicito. – matt

+0

Ho aggiunto un'implementazione di '==' ma le operazioni impostate continuano a non funzionare – shakked

Problemi correlati