在 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
}))
我认为 NSArray
让 compactMap
和朋友们从符合 Sequence
协议。所以标准库正在尽其所能帮助你。就像提到的@Rob,最好使用桥接而不是试图留在 NSArray
-land
我正在尝试为 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
}))
我认为 NSArray
让 compactMap
和朋友们从符合 Sequence
协议。所以标准库正在尽其所能帮助你。就像提到的@Rob,最好使用桥接而不是试图留在 NSArray
-land