Swift设置为数组

Fri*_*ice 169 arrays set swift

一个NSSet可以被转换为Array使用set.allObjects(),但有在新的没有这样的方法Set(与夫特1.2引入).它仍然可以通过将Swift Set转换为NSSet并使用该allObjects()方法来完成,但这不是最佳的.

Mar*_*n R 328

您可以创建从一个给定斯威夫特的所有元素的数组 Set简单地

let array = Array(someSet)
Run Code Online (Sandbox Code Playgroud)

这是因为Set符合SequenceType协议,并且Array可以使用序列进行初始化.例:

let mySet = Set(["a", "b", "a"])  // Set<String>
let myArray = Array(mySet)        // Array<String>
print(myArray) // [b, a]
Run Code Online (Sandbox Code Playgroud)

  • 作为旁注,`let array = Array(someSet)`也适用于Swift 2 (4认同)
  • @plusangel:是的,如果给出一个`NSSet`.问题是关于Swift`Set`. (3认同)

Ima*_*tit 19

在最简单的情况下,与斯威夫特3,你可以使用Arrayinit(_:)初始化得到一个ArraySet.init(_:)有以下声明:

init<S>(_ s: S) where S : Sequence, Element == S.Iterator.Element
Run Code Online (Sandbox Code Playgroud)

创建一个包含序列元素的数组.

用法:

let stringSet = Set(arrayLiteral: "car", "boat", "car", "bike", "toy")    
let stringArray = Array(stringSet)

print(stringArray)
// may print ["toy", "car", "bike", "boat"]
Run Code Online (Sandbox Code Playgroud)

但是,如果您还希望对Setwhile的每个元素执行某些操作,将其转换为a Array,则可以使用map,flatMapsort,filter以及Collection协议提供的其他功能方法:

let stringSet = Set(["car", "boat", "bike", "toy"])
let stringArray = stringSet.sorted()

print(stringArray)
// will print ["bike", "boat", "car", "toy"]
Run Code Online (Sandbox Code Playgroud)
let stringSet = Set(arrayLiteral: "car", "boat", "car", "bike", "toy") 
let stringArray = stringSet.filter { $0.characters.first != "b" }

print(stringArray)
// may print ["car", "toy"]
Run Code Online (Sandbox Code Playgroud)
let intSet = Set([1, 3, 5, 2]) 
let stringArray = intSet.flatMap { String($0) }

print(stringArray)
// may print ["5", "2", "3", "1"]
Run Code Online (Sandbox Code Playgroud)
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]
Run Code Online (Sandbox Code Playgroud)


小智 10

附加:

Swift没有设置和字典的DEFINED ORDER.因此你应该使用sorted()方法来防止意外的结果,例如你的数组可以像["a","b"]或["b","a "]你不想要这个.

固定这个:

为了设置

var example:Set = ["a","b","c"]
let makeExampleArray = [example.sorted()]
makeExampleArray 
Run Code Online (Sandbox Code Playgroud)

结果:["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"] 
Run Code Online (Sandbox Code Playgroud)

简单的数学:3!= 6


Cod*_*der 7

我创建了一个简单的扩展,给你一个无序Array的的属性Set雨燕4.0.

extension Set {
    var array: [Element] {
        return Array(self)
    }
}
Run Code Online (Sandbox Code Playgroud)

如果需要排序数组,可以添加其他计算属性,也可以修改现有属性以满足需要.

要使用它,只需打电话

let array = set.array
Run Code Online (Sandbox Code Playgroud)


Ken*_*ner 6

Swift 2.x 及更高版本的当前答案(来自关于集合类型的 Swift 编程语言指南)似乎是迭代 Set 条目,如下所示:

for item in myItemSet {
   ...
}
Run Code Online (Sandbox Code Playgroud)

或者,使用“排序”方法:

let itemsArray = myItemSet.sorted()
Run Code Online (Sandbox Code Playgroud)

Swift 设计者似乎不喜欢将 allObjects 作为访问机制,因为 Set 并不是真正有序的,因此他们希望确保在没有应用显式排序的情况下不会获取数组。

如果您不想要排序的开销并且不关心顺序,我通常使用 map 或 flatMap 方法,它们应该会更快地提取数组:

let itemsArray = myItemSet.map { $0 }
Run Code Online (Sandbox Code Playgroud)

这将构建 Set 所保存类型的数组,如果您需要它是特定类型的数组(例如,来自未声明为类型集的托管对象关系集的权利),您可以执行以下操作:

var itemsArray : [MyObjectType] = []
if let typedSet = myItemSet as? Set<MyObjectType> {
 itemsArray = typedSet.map { $0 }
}
Run Code Online (Sandbox Code Playgroud)