回答:
あなたは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]
NSSet
。問題はSwiftに関するものでしたSet
。
最も単純なケースでは、Swift 3では、Array
のinit(_:)
初期化子を使用してArray
からを取得できますSet
。init(_:)
次の宣言があります:
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]
追加:
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
私はあなたにソートされていないを与える単純な拡張作成Array
のプロパティとしてSet
でスウィフト4.0。
extension Set {
var array: [Element] {
return Array(self)
}
}
並べ替えられた配列が必要な場合は、計算されたプロパティを追加するか、ニーズに合わせて既存のプロパティを変更できます。
これを使うには、
let array = set.array
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)
。どちらも、セットのすべての要素を列挙して配列を作成します。後者はまだ機能しますが、上記のコメントの詳細を教えていただければ幸いです。
let array = Array(someSet)
またスウィフト2で動作します