NSSet
可以使用set.allObjects()
转换为Array
,但在新的Set
(随Swift 1.2引入)中没有这种方法。这仍然可以通过将Swift集转换为NSSet并使用allObjects()
方法来完成,但这并不是最优的。
发布于 2015-03-14 16:06:34
您只需使用以下命令即可创建一个包含给定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]
发布于 2016-10-25 11:00:32
对于Swift 2.x和更高版本(来自Swift编程语言指南中的Collection Types),当前的答案似乎是迭代集合项目,如下所示:
for item in myItemSet {
...
}
或者,使用"sorted“方法:
let itemsArray = myItemSet.sorted()
看来Swift的设计者不喜欢allObjects作为一种访问机制,因为集合并不是真正有序的,所以他们想确保你在没有应用显式排序的情况下不会得到一个数组。
如果您不想要排序的开销,也不关心顺序,我通常使用map或flatMap方法,这应该会更快地提取数组:
let itemsArray = myItemSet.map { $0 }
它将构建一个Set拥有的类型的数组,如果您需要它是一个特定类型的数组(例如,从一组未声明为类型化set的托管对象关系中获得权限),您可以这样做:
var itemsArray : [MyObjectType] = []
if let typedSet = myItemSet as? Set<MyObjectType> {
itemsArray = typedSet.map { $0 }
}
发布于 2015-11-24 21:34:34
调用此方法并传递您的set
func getArrayFromSet(set:NSSet)-> NSArray {
return set.map ({ String($0) })
}
如下所示:
var letters:Set = Set<String>(arrayLiteral: "test","test") // your set
print(self.getArrayFromSet(letters))
https://stackoverflow.com/questions/29046695
复制相似问题