【问题标题】:Swift NSArray mutationSwift NSArray 突变
【发布时间】:2017-06-22 07:52:48
【问题描述】:

我有两个变量,一个是可变数组,第二个是不可变的。

let mutableArray = NSMutableArray(array: ["1","2","3"])

let immutableArray: NSArray = mutableArray

但是当我将元素附加到mutableArray 时,我的immutableArray 也在发生变化。

所以我的假设是在immutableArray 分配中使用.copy。但它是解决问题的最佳变量吗?

【问题讨论】:

  • 您在let immutableArray: NSArray = mutableArray 中所做的作业不会进行深层复制。您的假设是正确的,因为您需要制作.copy
  • @ShamasS 但是如果数组非常大,使用 .copy 会不会对性能产生影响?
  • 如果它们相当大,copy 肯定会很贵。
  • 有什么理由不使用 Swift Array
  • @MartinR 强烈依赖于 Obj-c 数据结构的使用。强我的意思是所有子项目都在类中使用它们并作为函数中的参数。

标签: ios swift nsmutablearray nsarray


【解决方案1】:

您应该改用 Swift 基础类型 Array,它们默认是不可变的,并且是值类型而不是引用类型。

let numbers = [1, 2, 3] // type is: [Int]
let strings = numbers.map { $0.description } // type is: [String]
print(strings) // ["1", "2", "3"]

// THIS DOES NOT COMPILE
strings.append("foo") //Compilation error: cannot use mutating member on immultable value `strings` is a `let` constant

// Instead, super easily, declare a mutable copy just by this line
var mutableStrings = strings // since `Array` is value type, this only copies values over
mutableStrings.append("foo")
print(mutableStrings) // ["1", "2", "3", "foo"]

或者您是否出于某些特殊原因需要 NSArray?

使用Array有很多好处,可以直接使用map(如上)、reduceflatMapfilter等。如果您想在NSArray 上使用map,您需要转换为AnyObject,然后使用flatMap 过滤掉可选项:

let numbers = NSArray(array: [1, 2, 3])
let strings = numbers.map { ($0 as AnyObject).description  }.flatMap { $0 }
print(strings) // ["1", "2", "3"]

这只是丑陋和凌乱......那么为什么不立即使用Array呢? :)

【讨论】:

    【解决方案2】:

    你可以这样做

    let mutableArray = NSMutableArray(array: ["1","2","3"])
    let immutableArray: NSArray = NSArray(array: mutableArray)
    
    mutableArray.add("4")
    print(mutableArray) // (1,2,3,4)
    print(immutableArray) // (1,2,3)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多