অ্যারেতে সুইফ্ট সেট করুন


186

একটি ব্যবহারে NSSetরূপান্তরিত হতে পারে তবে নতুনটিতে এমন কোনও পদ্ধতি নেই (সুইফট ১.২ সহ প্রবর্তিত)। এটি এখনও সুইফেট সেটটিকে এনএসএসেটে রূপান্তর করে এবং পদ্ধতিটি ব্যবহার করে করা যেতে পারে তবে এটি অনুকূল নয়।Arrayset.allObjects()SetallObjects()

উত্তর:


351

আপনি 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
সুরগাচ

... বা আমারআরয় = myNSSet.allObjects হিসাবে হিসাবে দিন! [মাইস্পেসিফিক টাইপ]
এঞ্জেলস.পি

3
@ প্লাসানজেল: হ্যাঁ, যদি NSSetদেওয়া হয়। প্রশ্নটি ছিল একটি সুইফ্ট সম্পর্কে Set
মার্টিন আর

@ কেন্ডালহেল্মস্টেটার জেলনার: আমি উপরের কোড উদাহরণটি সুইফট ২.৩ এবং সুইফট both. উভয় দিয়ে ডাবল-চেক করেছি, এটি আমার জন্য প্রত্যাশার মতো সংকলিত এবং কাজ করেছে। আপনি কি ত্রুটি পেতে পারি?
মার্টিন আর

@ মার্টিনআর আকর্ষণীয়, আমি এটি এনএস-ম্যানেজডঅবজেক্ট সম্পর্ক থেকে একটি সেট নিয়ে চেষ্টা করছিলাম এবং এটি সেই সময় অ্যারে নির্মাণকারীকে পছন্দ হয়নি - এখন আমি সমস্যাটি পুনরুত্পাদন করার চেষ্টা করছি যদিও, আমি পারি না। যদিও অ্যারে কনস্ট্রাক্টরে আমাকে "অ্যারেলিটারাল:" লেবেল যুক্ত করতে হবে। আমি আমার আগের মন্তব্যটি সরিয়েছি যাতে এটি কাউকে বিভ্রান্ত না করে, পরীক্ষার জন্য ধন্যবাদ! আমি জানি না কেন সুইফট
গাইডটিতে

21

সবচেয়ে সহজ যদি , সুইফট 3, আপনি ব্যবহার করতে পারেন Array'র init(_:)সূচনাকারী একটি পেতে ArrayA থেকে 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]

এই পদ্ধতির একটি ব্যবহার করে আমি alচ্ছিক সেট থেকে alচ্ছিক অ্যারে করতে পারি।
tzologa

11

যোগ :

সুইফ্টের নং আছে সেট এবং অভিধানের জন্য সংজ্ঞায়িত অর্ডার that সেই কারণে অপ্রত্যাশিত ফলাফল পেতে বাধা দেওয়ার জন্য আপনার বাছাই করা () পদ্ধতিটি ব্যবহার করা উচিত যেমন আপনার অ্যারে ["a", "বি"] বা "" বি "," এ "এর মতো হতে পারে "] এবং আপনি এটি চান না।

এটি ঠিক করতে:

সেট জন্য

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

ফলাফল: ["ক", "খ", "গ"]

বাছাই ছাড়াই ()

এটা হতে পারে:

["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

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

যদি আপনি একটি সাজানো অ্যারে চান, আপনি হয় অতিরিক্ত গণিত সম্পত্তি যুক্ত করতে পারেন, বা আপনার প্রয়োজন অনুসারে বিদ্যমানটি সংশোধন করতে পারেন।

এটি ব্যবহার করতে, কেবল কল করুন

let array = set.array

3

সুইফট ২.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
অ্যারে ব্যবহার করুন (<সেট>) আরও ভাল পছন্দ
সাবস্টিয়ান রিমে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.