NSSet可以使用Set . allobjects()转换为Array,但在新的Set (Swift 1.2引入)中没有这样的方法。它仍然可以通过将Swift Set转换为NSSet并使用allObjects()方法来完成,但这不是最佳的。
你可以用给定Swift中的所有元素创建一个数组 简单地用
let array = Array(someSet)
这是因为Set符合SequenceType协议 数组可以用序列初始化。例子:
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($0) })
}
像这样:
var letters:Set = Set<String>(arrayLiteral: "test","test") // your set
print(self.getArrayFromSet(letters))
在最简单的情况下,在Swift 3中,你可以使用Array的init(_:)初始化器从Set中获取Array。Init(_:)有如下声明:
init<S>(_ s: S) where S : Sequence, Element == S.Iterator.Element
创建包含序列元素的数组。
用法:
let stringSet = Set(arrayLiteral: "car", "boat", "car", "bike", "toy")
let stringArray = Array(stringSet)
print(stringArray)
// may print ["toy", "car", "bike", "boat"]
然而,如果你也想对Set中的每个元素执行一些操作,同时将其转换为Array,你可以使用map, 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 { $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]
Swift 2的当前答案。x和更高(来自Swift编程语言指南的集合类型)似乎是迭代Set项,如下所示:
for item in myItemSet {
...
}
或者,使用“sorted”方法:
let itemsArray = myItemSet.sorted()
Swift的设计者似乎不喜欢allObjects作为一种访问机制,因为set并不是真正有序的,所以他们想确保你在没有应用显式排序的情况下不会得到数组。
如果你不想要排序的开销,也不关心顺序,我通常使用map或flatMap方法,这应该更快地提取数组:
let itemsArray = myItemSet.map { $0 }
它将构建一个Set所持有的类型的数组,如果你需要它是一个特定类型的数组(比如,来自一组未声明为类型化集的托管对象关系的标题),你可以这样做:
var itemsArray : [MyObjectType] = []
if let typedSet = myItemSet as? Set<MyObjectType> {
itemsArray = typedSet.map { $0 }
}
添加:
Swift没有定义集合和字典的顺序。因此,您应该使用sorted()方法来防止得到意想不到的结果,例如您的数组可能像["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
我创建了一个简单的扩展,给你一个无序数组作为Set在Swift 4.0的属性。
extension Set {
var array: [Element] {
return Array(self)
}
}
如果需要排序数组,可以添加额外的计算属性,也可以修改现有的计算属性以满足自己的需要。
要使用此功能,只需调用
let array = set.array
推荐文章
- 如何在JavaScript中映射/减少/过滤一个集?
- 如何停止不必要的UIButton动画标题变化?
- 使用Java在原语数组中查找最大/最小值
- 对象作为React子对象无效。如果要呈现子元素的集合,请使用数组
- 如何使用Swift播放声音?
- 越界访问数组有多危险?
- 如何解散ViewController在Swift?
- 保存字符串到NSUserDefaults?
- 如何将JSON字符串转换为字典?
- 什么是NSLocalizedString等效在Swift?
- 如何更新mongodb中的多个数组元素
- 什么时候在数组/数组列表上使用链表?
- 如何创建一个字符串的格式?
- Java的数组indexOf在哪里?
- 如何从c#数组中删除重复项?