web-dev-qa-db-ja.com

配列へのスイフトセット

NSSetset.allObjects()を使ってArrayに変換することができますが、新しいSet(Swift 1.2で導入された)にはそのようなメソッドはありません。それでもSwift SetをNSSetに変換してallObjects()メソッドを使用することで実現できますが、それは最適ではありません。

154
Fried Rice

与えられたSwiftのSetからすべての要素を持つ配列を作成することができます。

let array = Array(someSet)

SetSequenceTypeプロトコルに準拠しており、Arrayはシーケンスで初期化できるため、これは機能します。例:

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

最も単純な場合、Swift 3では、Arrayname__からArrayname__を取得するためにSetinit(_:) イニシャライザを使用できます。 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"]

しかし、もしあなたがSetname__の各要素をそれをArrayname__に変換しながらいくつかの操作を実行したいのであれば、mapname__、flatMapname__、sortname__、filtername__、およびCollectionname__を提供します。

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]
17
Imanou Petit

追加:

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

9
user7206023

Swift 4.ArrayのプロパティとしてソートされていないSetを与える簡単な拡張子を作りました。

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

ソートされた配列が必要な場合は、計算プロパティを追加するか、既存のプロパティをニーズに合わせて変更することができます。

これを使用するには、単に呼び出す

let array = set.array
6
CodeBender

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 }
}