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,你可以使用Array
的init(_:)
初始化器从一个Set
获取一个Array
。 init(_:)
具有以下声明:
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
协议提供的map
, flatMap
, sort
, filter
和其他函数方法:
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))