2016-08-30 4 views
5

में ऐरे का सेट बनाएं I सरणी से तत्वों को अद्वितीय बनाने के लिए सेट करने का प्रयास कर रहा था। मैंने सोचा कि यह काम शुरू करने के लिए सेट प्रारंभकर्ता का उपयोग करने के लिए एक शानदार दृष्टिकोण होगा। इसलिए मैंने सरणी बनाया और उस सरणी का उपयोग करके अपने नए को प्रारंभ करने का प्रयास किया। लेकिन संकलक शिकायत कर रहा था। मैंने इंटीजर मूल्यों का उपयोग करके इसे आजमाया और यह एक आकर्षण की तरह काम करता है। लेकिन मेरी अपनी कक्षा के साथ यह काम नहीं करता है। मैंने यह भी सोचा कि Equatable Protocol जाने का सही तरीका है .. लेकिन जैसा कि आप देखते हैं, यह मेरी समस्या का समाधान नहीं करता है।स्विफ्ट

निम्नलिखित खेल का मैदान पर विचार करें:

import UIKit 

internal struct Object: Equatable { 
    var a: Int 
} 

internal func == (lhs:Object,rhs: Object) -> Bool { 
    return lhs.a == rhs.a 
} 

let array = [Object(a:1),Object(a:1),Object(a:1),Object(a:1),Object(a:2)] 

let set = Set(array) // ERROR 

संकलक के साथ शिकायत कर रहा है

आह्वान नहीं कर सकते प्रारंभकर्ता सेट < _> प्रकार के तर्क [वस्तु]

कौन सा प्रोटोकॉल के साथ क्या चीजों को काम करने के लिए मुझे लागू करने की ज़रूरत है?

+5

' 'Object' Hashable' के अनुरूप होना चाहिए,:

अपने कोड का समायोजन। –

+0

संभावित डुप्लिकेट [स्विफ्ट में सेट करने के लिए सरणी को कम करें] (http://stackoverflow.com/questions/34161786/reduce-array-to-set-in-swift) – EmilioPelaez

+0

यह डुप्लिकेट नहीं है, मैं स्पष्ट रूप से पूछ रहा हूं प्रोटोकॉल की तरह मुझे लागू करने की जरूरत है। संदर्भित थ्रेड हैशबल प्रोटोकॉल के बारे में कुछ भी नहीं कहता है और इसमें कमी का उपयोग करके संरचनाएं होती हैं जो डेवलपर को गलत समाधान के लिए प्रेरित कर सकती हैं। यह पोस्ट अधिक सटीक है और इसे किसी अन्य स्टैक ओवरफ़्लो उपयोगकर्ताओं को उनकी समस्या के लिए समाधान ढूंढने में सहायता करने के लिए डुप्लिकेट के रूप में चिह्नित नहीं किया जाना चाहिए। –

उत्तर

8

यदि आप एक्सकोड में Set पर 'कमांड-क्लिक' करते हैं, तो यह आपको Set प्रकार की परिभाषा में ले जाता है। और वहाँ तुम जाओ:

/// A collection of unique `Element` instances with no defined ordering. 
public struct Set<Element : Hashable> : Hashable, CollectionType ... 

रोब ने उल्लेख किया तत्वों Hashable (जो बारी में की आवश्यकता है Equatable) को पुष्टि करनी होगी। न सिर्फ `Equatable`

import Foundation 

internal struct Object: Hashable { 
    var a: Int 
    var hashValue: Int { return a.hash } 
} 

internal func == (lhs:Object,rhs: Object) -> Bool { 
    return lhs.a == rhs.a 
} 

let array = [Object(a:1),Object(a:1),Object(a:1),Object(a:1),Object(a:2)] 

let set = Set(array) // SUCCESS