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,你可以使用Array
的init(_:)
初始化器得到一个Array
来自 Set
。 init(_:)
有以下声明:
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=、flatMap
、sort
、filter
等Collection
协议提供的功能方法:
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
可以使用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,你可以使用Array
的init(_:)
初始化器得到一个Array
来自 Set
。 init(_:)
有以下声明:
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=、flatMap
、sort
、filter
等Collection
协议提供的功能方法:
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