NSSet
はset.allObjects()
を使ってArray
に変換することができますが、新しいSet
(Swift 1.2で導入された)にはそのようなメソッドはありません。それでもSwift SetをNSSetに変換してallObjects()
メソッドを使用することで実現できますが、それは最適ではありません。
与えられたSwiftの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]
最も単純な場合、Swift 3では、Array
name__からArray
name__を取得するためにSet
init(_:)
イニシャライザを使用できます。 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
name__の各要素をそれをArray
name__に変換しながらいくつかの操作を実行したいのであれば、map
name__、flatMap
name__、sort
name__、filter
name__、およびCollection
name__を提供します。
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にはDEFINED ORDERがありません。そのため、配列が["a"、 "b"]のようになるなど、予期せぬ結果を防ぐためにsorted()メソッドを使用してください。 ["b"、 "a"]あなたはこれを望んでいません。
これを確定するために
セット用
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
Swift 4.でArray
のプロパティとしてソートされていないSet
を与える簡単な拡張子を作りました。
extension Set {
var array: [Element] {
return Array(self)
}
}
ソートされた配列が必要な場合は、計算プロパティを追加するか、既存のプロパティをニーズに合わせて変更することができます。
これを使用するには、単に呼び出す
let array = set.array
Swift 2.x以降(コレクション型に関するSwiftプログラミング言語ガイドから)に対する現在の回答は、Setエントリを次のように繰り返すことです。
for item in myItemSet {
...
}
あるいは、 "sorted"メソッドを使うためには:
let itemsArray = myItemSet.sorted()
セットは実際には順序付けされていないため、Swiftの設計者はallObjectsをアクセスメカニズムとして好まなかったようです。したがって、明示的な順序付けを適用せずに配列を取得しないようにしたいのです。
並べ替えのオーバーヘッドが不要で順序を気にしないのであれば、通常はmapまたはflatMapメソッドを使用します。これは配列を抽出するのに少し早いはずです。
let itemsArray = myItemSet.map { $0 }
これは、Setが保持する型の配列を作成します。それが特定の型の配列である必要がある場合(たとえば、型セットとして宣言されていない一連の管理オブジェクト関係からの資格)は次のようにできます。
var itemsArray : [MyObjectType] = []
if let typedSet = myItemSet as? Set<MyObjectType> {
itemsArray = typedSet.map { $0 }
}