Swift:要设置 NSArray?

Swift: NSArray to Set?

我正在尝试将 NSArray 转换为 Swift Set

运气不好。

这样做的正确方法是什么?

例如,如果我有 NSArray 个数字:

@[1,2,3,4,5,6,7,8]

如何从 NSArray 创建 Swift Set

如果您知道自己正在使用 Ints,您可以随时遍历数组并手动将每个元素添加到 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 数组(或 DoubleNSNumber,取决于您的需要)并从中创建一个集合:

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)