ऐरे को स्विफ्ट सेट करें


187

एक NSSetका Arrayउपयोग कर परिवर्तित किया जा सकता है, set.allObjects()लेकिन नए में ऐसी कोई विधि नहीं है Set(स्विफ्ट 1.2 के साथ पेश किया गया है)। यह अभी भी स्विफ्ट सेट को एनएसएसईटी में परिवर्तित करके और allObjects()विधि का उपयोग करके किया जा सकता है लेकिन यह इष्टतम नहीं है।

जवाबों:


352

आप किसी एक स्विफ्ट से सभी तत्वों के साथ एक सरणी बना सकते हैं Setबस के साथ

let array = Array(someSet)

यह काम करता है क्योंकि प्रोटोकॉल के Setअनुरूप है SequenceTypeऔर Arrayएक अनुक्रम के साथ आरंभ किया जा सकता है। उदाहरण:

let mySet = Set(["a", "b", "a"])  // Set<String>
let myArray = Array(mySet)        // Array<String>
print(myArray) // [b, a]

4
एक साइड नोट के रूप let array = Array(someSet)में, स्विफ्ट 2 में भी काम करता है
सुराग

... या myArray = myNSSet.allObjects के रूप में जाने दें! [mySpecificType]
angelos.p

3
@plusangel: हाँ, अगर एक NSSetदिया जाता है। सवाल एक स्विफ्ट को लेकर था Set
मार्टिन आर

@KendallHelmstetterGelner: मैंने स्विफ्ट 2.3 और स्विफ्ट दोनों के साथ उपरोक्त कोड उदाहरण को डबल-चेक किया है। यह मेरे लिए उम्मीद के अनुसार संकलित और काम किया है। आपको क्या त्रुटि मिल रही है?
मार्टिन आर

@MartinR दिलचस्प है, मैं इसे एक NSManagedObject संबंध से एक सेट के साथ कोशिश कर रहा था, और यह उस समय ऐरे कंस्ट्रक्टर को पसंद नहीं था - अब जब मैं समस्या को पुन: पेश करने की कोशिश करता हूं, तो मैं नहीं कर सकता। मुझे "सरणीलिटरल:" लेबल जोड़ना होगा, हालांकि ऐरे कंस्ट्रक्टर में लेबल। मैंने अपनी पिछली टिप्पणी को हटा दिया ताकि यह किसी को भ्रमित न करे, जाँच के लिए धन्यवाद! मुझे नहीं पता कि स्विफ्ट गाइड के पास यह रूपांतरण फ़ॉर्म क्यों नहीं है ...
केंडल हेल्मेस्सेट्टर गेलनर

21

सबसे सामान्य स्थिति में , स्विफ्ट 3 के साथ, आप उपयोग कर सकते हैं Arrayके init(_:)प्रारंभकर्ता एक पाने के लिए Arrayएक से Setinit(_:)निम्नलिखित घोषणा है:

init<S>(_ s: S) where S : Sequence, Element == S.Iterator.Element

एक अनुक्रम के तत्वों से युक्त एक सरणी बनाता है।

उपयोग:

let stringSet = Set(arrayLiteral: "car", "boat", "car", "bike", "toy")    
let stringArray = Array(stringSet)

print(stringArray)
// may print ["toy", "car", "bike", "boat"]

हालांकि , आप भी के प्रत्येक तत्व पर कुछ कार्रवाई करने चाहते हैं, तो आपके Setलिए यह एक में बदलने जबकि Array, आप उपयोग कर सकते हैं map, flatMap, sort, filterऔर अन्य कार्यात्मक द्वारा प्रदान तरीकों Collectionप्रोटोकॉल:

let stringSet = Set(["car", "boat", "bike", "toy"])
let stringArray = stringSet.sorted()

print(stringArray)
// will print ["bike", "boat", "car", "toy"]
let stringSet = Set(arrayLiteral: "car", "boat", "car", "bike", "toy") 
let stringArray = stringSet.filter { $0.characters.first != "b" }

print(stringArray)
// may print ["car", "toy"]
let intSet = Set([1, 3, 5, 2]) 
let stringArray = intSet.flatMap { String($0) }

print(stringArray)
// may print ["5", "2", "3", "1"]
let intSet = Set([1, 3, 5, 2])
// alternative to `let intArray = Array(intSet)`
let intArray = intSet.map { $0 }

print(intArray)
// may print [5, 2, 3, 1]

इस पद्धति का उपयोग करके मैं वैकल्पिक सेट से वैकल्पिक सरणी बना सकता हूं।
तंजोगा

11

विवरण:

स्विफ्ट में कोई निर्धारित आदेश नहीं है Set and Dictionary के लिए इस कारण से आपको अनपेक्षित परिणाम प्राप्त करने से रोकने के लिए छंटनी () विधि का उपयोग करना चाहिए जैसे कि आपका सरणी ["a", "b"] या ["b", "एक "] और आप यह नहीं चाहते हैं।

इस के लिए:

सेट्स के लिए

var example:Set = ["a","b","c"]
let makeExampleArray = [example.sorted()]
makeExampleArray 

परिणाम: ["a", "b", "c"]

बिना क्रमबद्ध ()

यह हो सकता है:

["a","b","c"] or ["b","c","a",] or ["c","a","b"] or ["a","c","b"] or ["b","a","c"] or ["c","b","a"] 

सरल गणित: 3! = 6


10

मैं एक सरल विस्तार है कि आप एक अवर्गीकृत देता है बनाया Arrayका एक संपत्ति के रूप में Setमें स्विफ्ट 4.0

extension Set {
    var array: [Element] {
        return Array(self)
    }
}

यदि आप एक क्रमबद्ध सरणी चाहते हैं, तो आप या तो एक अतिरिक्त गणना की गई संपत्ति जोड़ सकते हैं, या अपनी आवश्यकताओं के अनुरूप मौजूदा को संशोधित कर सकते हैं।

इसका उपयोग करने के लिए, बस कॉल करें

let array = set.array

3

स्विफ्ट 2.x और उच्चतर (संग्रह प्रकारों पर स्विफ्ट प्रोग्रामिंग भाषा गाइड से) के लिए वर्तमान उत्तर या तो सेट प्रविष्टियों पर पुनरावृति करने के लिए ऐसा लगता है:

for item in myItemSet {
   ...
}

या, "क्रमबद्ध" विधि का उपयोग करने के लिए:

let itemsArray = myItemSet.sorted()

ऐसा लगता है कि स्विफ्ट डिज़ाइनर ऑल ऑबजेक्ट्स को एक एक्सेस मैकेनिज़्म के रूप में पसंद नहीं करते थे क्योंकि सेट्स वास्तव में ऑर्डर नहीं किए जाते हैं, इसलिए वे यह सुनिश्चित करना चाहते थे कि आप एक स्पष्ट ऑर्डर किए बिना किसी सरणी से बाहर नहीं निकले।

यदि आप सॉर्टिंग का ओवरहेड नहीं चाहते हैं और ऑर्डर के बारे में परवाह नहीं करते हैं, तो मैं आमतौर पर मैप या फ्लैटपाइप विधियों का उपयोग करता हूं जो एक सरणी निकालने के लिए थोड़ा तेज होना चाहिए:

let itemsArray = myItemSet.map { $0 }

जो सेट के प्रकार की एक सरणी का निर्माण करेगा, यदि आपको इसकी आवश्यकता है कि यह एक विशिष्ट प्रकार की एक सरणी हो (जैसे, प्रबंधित ऑब्जेक्ट संबंधों के सेट से मिलती है जिसे टाइप किए गए सेट के रूप में घोषित नहीं किया जाता है) तो आप कुछ ऐसा कर सकते हैं:

var itemsArray : [MyObjectType] = []
if let typedSet = myItemSet as? Set<MyObjectType> {
 itemsArray = typedSet.map { $0 }
}

myItemSet.sorted()तत्वों की आवश्यकता है Comparable। - myItemSet.map { $0 }एक ही परिणाम का उत्पादन करना चाहिए Array(myItemSet), दोनों सेट के सभी तत्वों की गणना करके एक सरणी बनाते हैं। उत्तरार्द्ध अभी भी मेरे लिए काम करता है, आपके उपरोक्त टिप्पणी पर कुछ विवरण की सराहना की जाएगी।
मार्टिन आर

-2

इस विधि को कॉल करें और अपना सेट पास करें

func getArrayFromSet(set:NSSet)-> NSArray {

return set.map ({ String($0) })
}

इस तरह :

var letters:Set = Set<String>(arrayLiteral: "test","test") // your set
print(self.getArrayFromSet(letters))

2
ऐरे का उपयोग करें (<सेट>) एक बेहतर विकल्प है
सेबस्टियन रेमी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.