2017-06-22 31 views
1

私は2つの変数を持っています。一つは変更可能な配列、もう一つは不変です。Swift NSArrayの突然変異

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

let immutableArray: NSArray = mutableArray 

しかし、私は私のimmutableArrayも変化しているのmutableArrayする要素を追加します。

私の前提はをimmutableArrayに割り当てることです。しかし、問題を解決するには最適なバリアンですか?

+0

にあなたはimmutableArrayを聞かせて 'で行う割り当てを行うことができます。 あなたの仮定は正しいので、 '.copy'を作成する必要があります。 –

+0

@ ShamasSしかし、配列が.copyの意志を使ってかなり大きい場合、またはパフォーマンスに影響しませんか? –

+0

かなり大きい場合、 'copy'は間違いなく高価になります。 –

答えて

3

スウィフトファンデーションタイプ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にキャストし、する必要がNSArraymapを使用したい場合はflatMapを使用してoptionalsをフィルタリング:

ただ醜いと厄介です
let numbers = NSArray(array: [1, 2, 3]) 
let strings = numbers.map { ($0 as AnyObject).description }.flatMap { $0 } 
print(strings) // ["1", "2", "3"] 

...なぜ代わりに、すぐにArrayを使わないのでしょうか? NSArrayの= mutableArray` 深いコピーを作成しません::)

-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)