【问题标题】:Convert NSArray to Array in extension in Swift在 Swift 的扩展中将 NSArray 转换为 Array
【发布时间】:2020-07-14 17:06:50
【问题描述】:

我正在尝试为使用一些 Swift 方法的 NSArray 制作 Swift 扩展,但在从 NSArray 创建正确格式化的 Swift 数组的第一步时遇到了麻烦。

传入的 NSArray 看起来像

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

以下是不同版本的扩展:

这个版本创建了一个有效的数组,但是因为数组是一个 NSArray,而不是一个数组,所以在 line counts[item] 上失败并出现错误

不能使用索引为 '[String : Int]' 类型的值下标 输入“任何”

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 { $0 as? String } //This compiles but array is empty
var array3: [String] = self.compactMap({ $0 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。

感谢您的任何建议。

【问题讨论】:

  • 如果您提供扩展代码可能会有所帮助。
  • @nteissler 说了什么。另外,你为什么在 Swift 中搞乱 NSArrays。应该没有理由。
  • 之所以使用 NSArray,是因为大部分项目都在 Obj-C 中。但是,我想要做的是,在 Swift 中创建一个按发生率排序的唯一值数组更容易。所以我想我会使用 Swift 扩展。

标签: swift nsarray flatmap swift-extensions


【解决方案1】:

值得注意的是,NSArray bridging 在最近的 swift 版本中变得非常好。例如,以下所有方法都有效

let array: NSArray = NSArray(array: [3, 2, 1])
print(array)
print(type(of: array))
let newArray = array.compactMap { $0 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

【讨论】:

    猜你喜欢
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多