配列に設定されたスウィフト


187

NSSet変換することができるArray使用set.allObjects()が、新たにそのような方法は存在しないSet(スウィフト1.2で導入された)が。それでも、Swift SetをNSSetに変換してallObjects()メソッドを使用することで実行できますが、それは最適ではありません。

回答:


352

あなたはSet単に与えられたSwiftからのすべての要素で配列を作成することができます

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で動作します
Suragch

...またはmyArray = myNSSet.allObjects as![mySpecificType]
angelos.p

3
@plusangel:はいNSSet。問題はSwiftに関するものでしたSet
マーティンR

@KendallHelmstetterGelner:上記のコード例をSwift 2.3とSwift 3の両方で再確認しました。コンパイルして期待どおりに動作しました。どのようなエラーが発生しますか?
Martin R

@MartinR興味深いことに、私はNSManagedObject関係のセットを使用してそれを試していましたが、当時のArrayコンストラクターは好きではありませんでした。ただし、 "arrayLiteral:"ラベルをArrayコンストラクターに追加する必要があります。以前のコメントを削除したので、誰も混乱させないように、チェックしてくれてありがとう!Swiftガイドにこの変換形式がない理由はわかりません...
Kendall Helmstetter Gelner 2016

21

最も単純なケースでは、Swift 3では、Arrayinit(_:)初期化子を使用して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、あなたが使用することができmapflatMapsortfilterおよびによって提供される他の機能のメソッド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]

このメソッドの1つを使用して、オプションセットからオプションの配列を作成できます。
tzaloga 2017年

11

追加:

SwiftにはSetおよびDictionaryの定義済みの順序がありません。そのため、sorted()メソッドを使用して、配列が["a"、 "b"]または["b"、 "aのような予期しない結果になるのを防ぐ必要があります。 "]そしてあなたはこれを望まない。

これを修正するには:

セット用

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

結果:["a"、 "b"、 "c"]

Sorted()なし

かもね:

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

Swift 2.x以降(コレクションタイプに関するSwiftプログラミング言語ガイドから)に対する現在の答えは、次のようにSetエントリを反復することです。

for item in myItemSet {
   ...
}

または、「並べ替え」メソッドを使用するには:

let itemsArray = myItemSet.sorted()

セットは実際には順序付けされていないため、Swiftの設計者はアクセスメカニズムとしてallObjectsを好まなかったようで、明示的な順序付けを適用せずに配列を取得しないようにしたかったのです。

並べ替えのオーバーヘッドが不要で、順序を気にしない場合は、通常、配列を抽出するために少し高速なmapまたはflatMapメソッドを使用します。

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)。どちらも、セットのすべての要素を列挙して配列を作成します。後者はまだ機能しますが、上記のコメントの詳細を教えていただければ幸いです。
Martin R

-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
Array(<Set>)を使用することをお
勧めします
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.