Swift设置为数组

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

您可以使用给定的Swift Set所有元素创build一个数组

 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,你可以使用Arrayinit(_:)初始化器从一个Set获取一个Arrayinit(_:)具有以下声明:

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

创build一个包含序列元素的数组。

用法:

 let stringSet = Set(arrayLiteral: "car", "boat", "car", "bike", "toy") let stringArray = Array(stringSet) print(stringArray) // may print ["toy", "car", "bike", "boat"] 

但是 ,如果您还希望在将Set转换为Array每个元素时执行一些操作,则可以使用Collection协议提供的mapflatMapsortfilter和其他函数方法:

 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] 

附加:

对于Set和Dictionary,Swift没有DEFINED ORDER 。因此,你应该使用sorted()方法来防止得到意想不到的结果,比如你的数组可以像[“a”,“b”]或[“b”,“a “],你不想要这个。

要修正这个问题:

为集合

 var example:Set = ["a","b","c"] let makeExampleArray = [example.sorted()] makeExampleArray 

结果:[“a”,“b”,“c”]

没有sorting()

有可能:

 ["a","b","c"] or ["b","c","a",] or ["c","a","b"] or ["a","c","b"] or ["b","a","c"] or ["c","b","a"] 

简单的math:3! = 6

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

 for item in myItemSet { ... } 

或者,使用“sorting”方法:

 let itemsArray = myItemSet.sorted() 

Swift的devise者似乎并不喜欢所有的对象作为一个访问机制,因为集合并不是真正的有序,所以他们想要确保在没有明确的sorting的情况下你不会得到一个数组。

如果你不想sorting的开销和不关心的顺序,我通常使用地图或flatMap方法应该快一点来提取数组:

 let itemsArray = myItemSet.map { $0 } 

如果你需要它是一个特定types的数组(也就是说,从一组未被声明为types化集合的pipe理对象关系中获得权限),你可以做如下的操作:

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

我创build了一个简单的扩展,为您提供一个未分类的数组作为Set in Swift 3.0的一个属性。

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

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

要使用这个,只需打电话

 let array = set.array 

调用这个方法并通过你的设置

 func getArrayFromSet(set:NSSet)-> NSArray { return set.map ({ String($0) }) } 

喜欢这个 :

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