在 Swift 中将 NSArray 转换为 Array in extension

Convert NSArray to Array in extension in Swift

我正在尝试为 NSArray 创建一个 Swift 扩展,它使用了一些 Swift 方法,但是在从 NSArray 创建格式正确的 Swift 数组的第一步中遇到了问题.

传入的 NSArray 看起来像

[@"Hello",@"Me",@"That",@"Me",@"Hello",@"Me",@"as",@"the"]

以下是扩展的不同版本:

此版本创建了一个有效的数组,但由于该数组是一个 NSArray,而不是一个数组,因此在行 counts[item] 上失败并出现错误

cannot subscript a value of type '[String : Int]' with an index of type 'Any'

public extension NSArray {
public var sortedArray: NSArray {
let array : NSArray = self
for item in array {
    counts[item] = (counts[item] ?? 0) + 1
    }
    print("counts",counts)

下一个有效但没有将数组作为输入

public extension NSArray {
public var sortedArray: NSArray {
var array = ["Hello","Me","That","Me","Hello","Me","as","the"] 
for item in array {
    counts[item] = (counts[item] ?? 0) + 1
    }
    print("counts",counts)

以下两种方法编译通过但 array2 和 array3 最终为空

public extension NSArray {
public var sortedArray: NSArray {
var array2: [String] = self.flatMap { [=14=] as? String } //This compiles but array is empty
var array3: [String] = self.compactMap({ [=14=] as? String }) //This compiles but 
for item in array2 {
    counts[item] = (counts[item] ?? 0) + 1
    }
    print("counts",counts)//prints 0 as the array is empty

注意:当我在扩展开始处插入断点时,self 是一个有效的 NSArray,包含很多元素。

感谢您的任何建议。

值得注意的是,NSArray 桥接在 swift 的最新版本中变得非常好。例如,以下所有作品

let array: NSArray = NSArray(array: [3, 2, 1])
print(array)
print(type(of: array))
let newArray = array.compactMap { [=10=] as? Int }.compactMap(UInt8.init)
print(newArray)

print(array.sorted(by: { (left, right) -> Bool in
    guard let left = left as? Int, let right = right as? Int else {
        return false
    }
    return left < right
}))

我认为 NSArraycompactMap 和朋友们从符合 Sequence 协议。所以标准库正在尽其所能帮助你。就像提到的@Rob,最好使用桥接而不是试图留在 NSArray-land