Swift:要设置 NSArray?
Swift: NSArray to Set?
我正在尝试将 NSArray
转换为 Swift Set
。
运气不好。
这样做的正确方法是什么?
例如,如果我有 NSArray
个数字:
@[1,2,3,4,5,6,7,8]
如何从 NSArray
创建 Swift Set
?
如果您知道自己正在使用 Int
s,您可以随时遍历数组并手动将每个元素添加到 Set<Int>
:
let theArray = NSArray(array: [1,2,3,4,5,6,7,8])
var theSet = Set<Int>()
for number in (theArray as? [Int])! {
theSet.insert(number)
}
print(theSet) // "[2, 4, 5, 6, 7, 3, 1, 8]\n"
我正在尝试使用 map
制定更优雅的解决方案,我会在取得更多进展时更新此答案。
感谢 MartinR 的 在 [=19] 上使用 unionInPlace
(接受从 map
返回的 SequenceType
)而不是 insert
=],这可以像这样完成:
let theArray = NSArray(array: [1,2,3,4,5,6,7,8])
var mySet = Set<Int>()
mySet.unionInPlace(theArray.map { [=11=] as! Int })
请注意,由于显式转换为 Int
,这可能不是最安全的解决方案。
如果您确定 NSArray
仅包含数字对象
然后你可以将它转换为 Int
的 Swift 数组(或 Double
或
NSNumber
,取决于您的需要)并从中创建一个集合:
let nsArray = NSArray(array: [1,2,3,4,5,6,7,8])
let set = Set(nsArray as! [Int])
如果不能保证,请使用可选的转换:
if let set = (nsArray as? [Int]).map(Set.init) {
print(set)
} else {
// not an array of numbers
}
另一种变体(受@JAL 评论的启发):
let set = Set(nsArray.flatMap { [=12=] as? Int })
// Swift 4.1 and later:
let set = Set(nsArray.compactMap { [=12=] as? Int })
这给出了一组可转换的所有 NSArray
元素
到 Int
,并默默地忽略所有其他元素。
import Foundation
let nsarr: NSArray = NSArray(array: [1,2,3,4,5])
var set: Set<Int>
guard let arr = nsarr as? Array<Int> else {
exit(-1)
}
set = Set(arr)
print(set.dynamicType)
dump(set)
/*
Set<Int>
▿ 5 members
- [0]: 5
- [1]: 2
- [2]: 3
- [3]: 1
- [4]: 4
*/
有了免费桥接,应该很容易...
var array = [1,2,3,4,5]
var set = Set(array)
我正在尝试将 NSArray
转换为 Swift Set
。
运气不好。
这样做的正确方法是什么?
例如,如果我有 NSArray
个数字:
@[1,2,3,4,5,6,7,8]
如何从 NSArray
创建 Swift Set
?
如果您知道自己正在使用 Int
s,您可以随时遍历数组并手动将每个元素添加到 Set<Int>
:
let theArray = NSArray(array: [1,2,3,4,5,6,7,8])
var theSet = Set<Int>()
for number in (theArray as? [Int])! {
theSet.insert(number)
}
print(theSet) // "[2, 4, 5, 6, 7, 3, 1, 8]\n"
我正在尝试使用 map
制定更优雅的解决方案,我会在取得更多进展时更新此答案。
感谢 MartinR 的 unionInPlace
(接受从 map
返回的 SequenceType
)而不是 insert
=],这可以像这样完成:
let theArray = NSArray(array: [1,2,3,4,5,6,7,8])
var mySet = Set<Int>()
mySet.unionInPlace(theArray.map { [=11=] as! Int })
请注意,由于显式转换为 Int
,这可能不是最安全的解决方案。
如果您确定 NSArray
仅包含数字对象
然后你可以将它转换为 Int
的 Swift 数组(或 Double
或
NSNumber
,取决于您的需要)并从中创建一个集合:
let nsArray = NSArray(array: [1,2,3,4,5,6,7,8])
let set = Set(nsArray as! [Int])
如果不能保证,请使用可选的转换:
if let set = (nsArray as? [Int]).map(Set.init) {
print(set)
} else {
// not an array of numbers
}
另一种变体(受@JAL 评论的启发):
let set = Set(nsArray.flatMap { [=12=] as? Int })
// Swift 4.1 and later:
let set = Set(nsArray.compactMap { [=12=] as? Int })
这给出了一组可转换的所有 NSArray
元素
到 Int
,并默默地忽略所有其他元素。
import Foundation
let nsarr: NSArray = NSArray(array: [1,2,3,4,5])
var set: Set<Int>
guard let arr = nsarr as? Array<Int> else {
exit(-1)
}
set = Set(arr)
print(set.dynamicType)
dump(set)
/*
Set<Int>
▿ 5 members
- [0]: 5
- [1]: 2
- [2]: 3
- [3]: 1
- [4]: 4
*/
有了免费桥接,应该很容易...
var array = [1,2,3,4,5]
var set = Set(array)