2017-06-22 39 views
1

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

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

let immutableArray: NSArray = mutableArray 

但是当我做追加元素到mutableArrayimmutableArray也在发生变化。

所以我的假设是使用.copyimmutableArray分配。但是解决这个问题的最佳方法是什么?

+0

你 做作业'让immutableArray:NSArray的= mutableArray' 不作深层副本。 你的假设是正确的,因为你需要制作'.copy'。 –

+0

@ShamasS但是如果数组非常大,使用.copy会不会影响性能? –

+0

如果它们相当大,'copy'肯定会很贵。 –

回答

3

您应该使用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等直接。如果你想在你需要转换为AnyObject,然后一个NSArray使用map过滤掉自选使用flatMap

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

这仅仅是丑陋和杂乱......那么,为什么不使用Array马上呢? :)

-1

你能做到这样

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)