Swift中的不可变/可变集合

我指的是Apple Swift编程指南,用于理解Swift语言中可变/不可变对象(数组,字典,集合,数据)的创build。 但是我不明白如何在Swift中创build一个不可变集合。

我想在Objective-C中的Swift中看到下面的等价物

不可变arrays

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"]; 

数组

创build不可变数组

第一种方法:

 let array = NSArray(array: ["First","Second","Third"]) 

第二种方式:

 let array = ["First","Second","Third"] 

创build可变数组

 var array = ["First","Second","Third"] 

将对象追加到数组

 array.append("Forth") 

字典

创build不可变的字典

 let dictionary = ["Item 1": "description", "Item 2": "description"] 

创build可变字典

 var dictionary = ["Item 1": "description", "Item 2": "description"] 

将新对添加到字典中

 dictionary["Item 3"] = "description" 

有关Apple Developer的更多信息

Swift在Objective-C的NSArray或其他集合类中没有任何替代。

有数组和字典类,但应该指出,这些是“值”types,NSArray和NSDictionary是“对象”types。

差别是微妙的,但可以是非常重要的,以避免边缘案例的错误。

在swift中,你创build一个“不可变”的数组:

 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"] 

您可以通过使用inout方法参数来实现NSMutableArray的行为:

 var myArray = ["a", "b", "c"] func addToArray(inout myArray: [String]) { myArray.append("d") } addToArray(&myArray) myArray // ["a", "b", "c", "d"] 

重新写了这个答案2015-08-10以反映当前的Swift行为。

Swift中只有一个Array和一个Dictionarytypes。 可变性取决于你如何构build它:

 var mutableArray = [1,2,3] let immutableArray = [1,2,3] 

即如果你创build一个赋值给一个variables是可变的,而如果你创build一个赋值为常量不是。

警告:不可变数组不是完全不可变的! 你仍然可以改变他们的内容,而不是他们的总长度!

只要声明你的(任何)对象或variables

 'let' key word -> for "constan/Immutable" array, dictionary, variable, object..etc. 

 'var' key word -> for "Mutable" array, dictionary, variable, object..etc. 

获取更深入的信息

“使用一个常量和var来做一个variables。 常量的值不需要在编译时知道,但是你必须给它赋值一次。 这意味着你可以使用常量来命名一个你确定曾经使用但在很多地方使用的值。

 var myVariable = 42 myVariable = 50 let myConstant = 42 

阅读“Swift编程语言”。

如果你想像NSArray一样使用Array (Swift),你可以使用一个简单的桥接函数。 例:

 var arr1 : Array = [] arr1.bridgeToObjectiveC().count 

let工作是一样的。

从苹果自己的文档:

集合的可变性

如果您创build一个数组,一个集合或一个字典并将其分配给一个variables,则创build的集合将是可变的。 这意味着您可以通过添加,删除或更改集合中的项目来更改(或改变)该集合。 相反,如果将一个数组,一个字典或一个字典分配给一个常量,那么这个集合是不可变的,并且它的大小和内容不能被改变。

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html#//apple_ref/doc/uid/TP40014097-CH8-ID105

不可变/可变集合的其他用途取决于你为什么希望它们是可变/不可变的。 集合是Swift中的types,这意味着它们的内容在被赋值为另一个值时被复制,或者被传递给另一个函数/方法。 因此,您不必担心接收方法函数是否可能更改原始数组。 因此,例如,如果您的类正在持有可变集合,则不需要确保返回一个不可变集合。

这没有内置的演员。 但是相反,你可以使用NSMutableDictionary的初始化器来获取字典:

 var foundationDictionary = NSMutableDictionary(dictionary: dictionary)