Swift 设为数组

Swift Set to Array

可以使用set.allObjects()NSSet转换为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]

调用此方法并传递您的设置

func getArrayFromSet(set:NSSet)-> NSArray {

return set.map ({ String([=10=]) })
}

像这样:

var letters:Set = Set<String>(arrayLiteral: "test","test") // your set
print(self.getArrayFromSet(letters))

在最简单的情况下,对于Swift 3,你可以使用Arrayinit(_:)初始化器得到一个Array 来自 Setinit(_:) 有以下声明:

init<S>(_ s: S) where S : Sequence, Element == S.Iterator.Element

Creates an array containing the elements of a sequence.

用法:

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

print(stringArray)
// may print ["toy", "car", "bike", "boat"]

但是,如果你还想对你的Set的每个元素执行一些操作,同时将它转换成Array,你可以使用[ =23=、flatMapsortfilterCollection协议提供的功能方法:

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 { [=13=].characters.first != "b" }

print(stringArray)
// may print ["car", "toy"]
let intSet = Set([1, 3, 5, 2]) 
let stringArray = intSet.flatMap { String([=14=]) }

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 { [=15=] }

print(intArray)
// may print [5, 2, 3, 1]

Swift 2.x 及更高版本的当前答案(来自 Swift 集合类型编程语言指南)似乎是像这样迭代 Set 条目:

for item in myItemSet {
   ...
}

或者,要使用 "sorted" 方法:

let itemsArray = myItemSet.sorted()

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

如果你不想要排序的开销并且不关心顺序,我通常使用 map 或 flatMap 方法来提取数组应该更快一些:

let itemsArray = myItemSet.map { [=12=] }

如果您需要它是特定类型的数组(例如,来自一组未声明为类型化集的托管对象关系的权利),这将构建一个 Set 持有的类型的数组,您可以做类似的事情:

var itemsArray : [MyObjectType] = []
if let typedSet = myItemSet as? Set<MyObjectType> {
 itemsArray = typedSet.map { [=13=] }
}

加法:

Swift 没有 DEFINED ORDER for Set 和 Dictionary.For 因此你应该使用 sorted() 方法来防止得到意想不到的结果,比如你的array 可以像 ["a","b"] 或 ["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

我创建了一个简单的扩展,它为您提供了一个未排序的 Array 作为 属性 的 Set in Swift 4.0 .

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

如果您想要一个排序数组,您可以添加一个额外的计算 属性,或者修改现有的一个以满足您的需要。

要使用它,只需调用

let array = set.array