2015-10-10 3 views
5

मैंने कस्टम ऑब्जेक्ट्स के साथ सेट ऑपरेशंस पर कुछ परीक्षण करने के लिए थोड़ा सा खेल मैदान बनाया लेकिन वे अभी भी असफल रहे हैं और मुझे नहीं पता कि क्यों।कस्टम ऑब्जेक्ट्स पर ऑपरेशन सेट करने के लिए आपको क्या करना चाहिए?

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] 

लेकिन जब मैं तो जैसे एक ऑपरेशन करना:

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 
} 

फिर, मैं User वस्तुओं के दो सेट बनाया

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

newSetuserSet1 के समान है और सेट में से कोई भी संशोधित हैं

इन सेट ऑपरेशंस को काम करने के लिए मुझे क्या करना चाहिए?

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

संकेत: इसे वापस करने से पहले 'एनएसएसटींग (स्ट्रिंग: आईडी) .integerValue' लॉग करें और देखें कि क्या आप सफलतापूर्वक आवश्यकताओं के लिए आवश्यकताओं को पूरा कर रहे हैं या नहीं। – matt

+0

लेकिन मेरे हैशवैल्यू के अनुसार, उनके पास – shakked

+0

में सदस्य हैं, मैंने 'हैशवैल्यू' गणना को अपडेट किया है और कुछ प्रिंट जोड़े हैं और आप देख सकते हैं कि उनमें से कुछ 'हैशवैल्यू' से मेल खाते हैं लेकिन ऑपरेशन अभी भी – shakked

उत्तर

3

आपको हैश मूल्य के रूप में उपयोग करने के बारे में अपना विचार नहीं उठाना है। हैशबिलिटी की आवश्यकता है: दो ऑब्जेक्ट्स का हैश मान समान होना चाहिए यदि उन दो ऑब्जेक्ट्स बराबर हैं।

आपने एक हैश वैल्यू एल्गोरिदम प्रदान किया है लेकिन आपने अपने उपयोगकर्ता ऑब्जेक्ट्स की समानता बनाने के बारे में कुछ भी नहीं किया है।

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

का निरीक्षण करें कि मैं इस बात को भी एक NSObject बनाने की जटिलता को हटा दिया है:

यहाँ एक उपयोगकर्ता उद्देश्य यह है कि एक सेट में hashable है। यदि आप ऐसा करना चाहते हैं तो चीजें थोड़ा अलग होती हैं; आपको एनएसओब्जेक्ट कैसे काम करता है इसके बारे में सोचना होगा।

+0

तो मुझे क्या करने की ज़रूरत है? – shakked

+1

जो मैंने अभी कहा है उसका क्या हिस्सा रहस्यमय है? मुझे लगता है कि मैं बहुत स्पष्ट था। – matt

+0

मैंने '==' का कार्यान्वयन जोड़ा लेकिन सेट ऑपरेशंस अभी भी काम नहीं कर रहे हैं – shakked

संबंधित मुद्दे

 संबंधित मुद्दे