Swift言語での可変/不変オブジェクト(配列、辞書、セット、データ)の作成を理解するために、AppleのSwiftプログラミングガイドを参照していました。しかし、Swiftで不変のコレクションを作成する方法を理解できませんでした。
Objective-Cの以下のSwiftで同等のものを見たい
不変の配列
NSArray *imArray = [[NSArray alloc]initWithObjects:@"First",@"Second",@"Third",nil];
可変配列
NSMutableArray *mArray = [[NSMutableArray alloc]initWithObjects:@"First",@"Second",@"Third",nil];
[mArray addObject:@"Fourth"];
不変辞書
NSDictionary *imDictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"Value1", @"Key1", @"Value2", @"Key2", nil];
可変辞書
NSMutableDictionary *mDictionary = [[NSMutableDictionary alloc]initWithObjectsAndKeys:@"Value1", @"Key1", @"Value2", @"Key2", nil];
[mDictionary setObject:@"Value3" forKey:@"Key3"];
不変配列の作成
最初の方法:
let array = NSArray(array: ["First","Second","Third"])
2番目の方法:
let array = ["First","Second","Third"]
可変配列の作成
var array = ["First","Second","Third"]
配列にオブジェクトを追加
array.append("Forth")
不変辞書を作成する
let dictionary = ["Item 1": "description", "Item 2": "description"]
可変ディクショナリの作成
var dictionary = ["Item 1": "description", "Item 2": "description"]
辞書に新しいペアを追加
dictionary["Item 3"] = "description"
Swiftには、NSArray
またはObjective-Cの他のコレクションクラスに代わるものがありません。
NS.
違いはわずかですが、エッジケースのバグを回避するために非常に重要です。
Swiftでは、次の「不変」配列を作成します。
let hello = ["a", "b", "c"]
そして、次の「可変」配列:
var hello = ["a", "b", "c"]
可変配列は、NSMutableArray
と同様に変更できます。
var myArray = ["a", "b", "c"]
myArray.append("d") // ["a", "b", "c", "d"]
ただし、可変配列を関数に渡すことはできません。
var myArray = ["a", "b", "c"]
func addToArray(myArray: [String]) {
myArray.append("d") // compile error
}
ただし、上記のコードはNSMutableArrayで機能します。
var myArray = ["a", "b", "c"] as NSMutableArray
func addToArray(myArray: NSMutableArray) {
myArray.addObject("d")
}
addToArray(myArray)
myArray // ["a", "b", "c", "d"]
NSMutableArray
メソッドパラメータを使用して、inout
の動作を実現できます。
var myArray = ["a", "b", "c"]
func addToArray(inout myArray: [String]) {
myArray.append("d")
}
addToArray(&myArray)
myArray // ["a", "b", "c", "d"]
現在のSwift挙動を反映するためにこの回答2015-08-10を書き直しました。
SwiftにはArray
タイプとDictionary
タイプが1つだけあります。可変性は、構築方法によって異なります。
var mutableArray = [1,2,3]
let immutableArray = [1,2,3]
つまり、変数への割り当てを作成する場合は可変ですが、定数への割り当てを作成する場合は変更できません。
警告:不変配列は完全に不変ではありません!全体の長さだけでなく、内容を変更することもできます!
(任意の)オブジェクトまたは変数を宣言するだけです
'let' key Word -> for "constan/Immutable" array, dictionary, variable, object..etc.
そして
'var' key Word -> for "Mutable" array, dictionary, variable, object..etc.
詳細については
「letを使用して定数を作成し、varを使用して変数を作成します。定数の値は、コンパイル時に知る必要はありませんが、値を一度だけ割り当てる必要があります。つまり、定数を使用して、一度決定した値に名前を付けることができますが、多くの場所で使用できます。」
var myVariable = 42
myVariable = 50
let myConstant = 42
Array
と同様にNSArray
(Swift)を使用する場合は、単純なブリッジ関数を使用できます。例:
var arr1 : Array = []
arr1.bridgeToObjectiveC().count
let
でも同じように機能します。
Apple自身のドキュメントから:
コレクションの可変性
配列、セット、または辞書を作成して変数に割り当てると、作成されるコレクションは変更可能になります。これは、コレクション内のアイテムを追加、削除、または変更することにより、作成後にコレクションを変更(または変更)できることを意味します。逆に、配列、セット、または辞書を定数に割り当てた場合、そのコレクションは不変であり、そのサイズと内容は変更できません。
不変/可変コレクションのその他の用途は、それらを可変/不変にする理由に依存します。コレクションは、Swiftのvalueタイプです。つまり、コレクションの内容は、別の値に割り当てられるか、別の関数/メソッドに渡されるときにコピーされます。したがって、受信メソッド関数が元の配列を変更するかどうかを心配する必要はありません。したがって、たとえば、クラスが可変コレクションを保持している場合、不変コレクションを返すことを保証する必要はありません。