2015-10-10 26 views
5

Küçük nesneler yapıp, özel nesneleri kullanarak işlemleri ayarla üzerine bazı testler yaptım ama hala başarısız oluyorlar ve neden hiçbir fikrim yok.Ayarlama işlemlerinin özel nesneler üzerinde çalışması için ne yapmalısınız?

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] 

Ama bir operasyon şöyle yaptığınızda:

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 
} 

Sonra ben User nesnelerin iki set yapılmış

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

newSetuserSet1 aynıdır ve setleri hiçbiri modifiye edilmiştir.

Bu set işlemlerini çalışmak için ne yapmalıyım?

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

İpucu: 'NSString (string: id) .integerValue' dosyasını döndürmeden önce döndürün ve elverişlilik gereksinimlerini başarıyla karşılayıp karşılamadığınızı görün. – matt

+0

Ancak, hashValue'ye göre, ortak üyeler – shakked

+0

'hashValue' hesaplamasını güncelledim ve bazı baskılar ekledim ve bazılarının "hashValues" ile eşleştiğini görebiliyorsunuz ancak işlem hala çalışmıyor – shakked

cevap

3

Karma değer olarak ne kullanacağınıza dair kendi fikrinizi oluşturmazsınız. Sağlanabilirlik gereksinimi şöyledir: Bu iki nesne eşitse, iki nesnenin karma değeri aynı olmalıdır.

Karma değer algoritması sağladınız, ancak Kullanıcı nesnelerinizle eşitlenebilmesini sağlamak için hiçbir şey yapmadınız.

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

Ben de bu şeyi bir NSObject yapma komplikasyon kaldırdık gözlemleyin: Burada

kümesindeki hashable olan bir kullanıcı nesnedir. Bunu yapmak istersen işler biraz farklı; NSObject'in nasıl çalıştığını düşünmeniz gerekecek.

+0

Peki ne yapmam gerekiyor? – shakked

+1

Az önce söylediğim şeyin bir kısmı gizemli mi? Bence oldukça açıktım. – matt

+0

'==' uygulamasının bir ekini ekledim ancak set işlemleri hala çalışmıyor – shakked

İlgili konular