Swift中的不可变/可变集合

Pra*_*wal 83 objective-c mutable immutability ios swift

我指的是Apple的Swift编程指南,用于理解用Swift语言创建Mutable/immutable对象(Array,Dictionary,Sets,Data).但我无法理解如何在Swift中创建不可变的集合.

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

不可变阵列

NSArray *imArray = [[NSArray alloc]initWithObjects:@"First",@"Second",@"Third",nil];
Run Code Online (Sandbox Code Playgroud)

可变阵列

NSMutableArray *mArray = [[NSMutableArray alloc]initWithObjects:@"First",@"Second",@"Third",nil];
[mArray addObject:@"Fourth"];
Run Code Online (Sandbox Code Playgroud)

不变字典

NSDictionary *imDictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"Value1", @"Key1", @"Value2", @"Key2", nil];
Run Code Online (Sandbox Code Playgroud)

可变字典

NSMutableDictionary *mDictionary = [[NSMutableDictionary alloc]initWithObjectsAndKeys:@"Value1", @"Key1", @"Value2", @"Key2", nil];
[mDictionary setObject:@"Value3" forKey:@"Key3"];
Run Code Online (Sandbox Code Playgroud)

nic*_*ael 110

数组

创建不可变数组

第一种方式:

let array = NSArray(array: ["First","Second","Third"])
Run Code Online (Sandbox Code Playgroud)

第二种方式:

let array = ["First","Second","Third"]
Run Code Online (Sandbox Code Playgroud)

创建可变数组

var array = ["First","Second","Third"]
Run Code Online (Sandbox Code Playgroud)

将对象追加到数组

array.append("Forth")
Run Code Online (Sandbox Code Playgroud)


字典

创建不可变字典

let dictionary = ["Item 1": "description", "Item 2": "description"]
Run Code Online (Sandbox Code Playgroud)

创建可变字典

var dictionary = ["Item 1": "description", "Item 2": "description"]
Run Code Online (Sandbox Code Playgroud)

将新对添加到字典中

dictionary["Item 3"] = "description"
Run Code Online (Sandbox Code Playgroud)

有关Apple Developer的更多信息

  • "固定长度"阵列会更精确.这不是一成不变的. (12认同)
  • 从Xcode 6 beta 3开始,这个答案已经过时了 (10认同)
  • 对.关于阵列的不可变性的更多信息[这个问题及其答案](http://stackoverflow.com/q/24090741/300836). (2认同)

Abh*_*ert 30

Swift没有替换NSArrayObjective-C中的其他集合类.

有数组和字典类,但应注意这些是"值"类型,与作为"对象"类型的NSArray和NSDictionary相比.

差异很微妙,但对于避免边缘案例错误非常重要.

在swift中,您创建一个"不可变"数组:

let hello = ["a", "b", "c"]
Run Code Online (Sandbox Code Playgroud)

和一个"可变"数组:

var hello = ["a", "b", "c"]
Run Code Online (Sandbox Code Playgroud)

可变数组可以修改如下NSMutableArray:

var myArray = ["a", "b", "c"]

myArray.append("d") // ["a", "b", "c", "d"]
Run Code Online (Sandbox Code Playgroud)

但是,您无法将可变数组传递给函数:

var myArray = ["a", "b", "c"]

func addToArray(myArray: [String]) {
  myArray.append("d") // compile error
}
Run Code Online (Sandbox Code Playgroud)

但上面的代码适用于NSMutableArray:

var myArray = ["a", "b", "c"] as NSMutableArray

func addToArray(myArray: NSMutableArray) {
  myArray.addObject("d")
}

addToArray(myArray)

myArray // ["a", "b", "c", "d"]
Run Code Online (Sandbox Code Playgroud)

您可以NSMutableArray使用inout方法参数实现以下行为:

var myArray = ["a", "b", "c"]

func addToArray(inout myArray: [String]) {
  myArray.append("d")
}

addToArray(&myArray)

myArray // ["a", "b", "c", "d"]
Run Code Online (Sandbox Code Playgroud)

重写2015-08-10的这个答案,以反映当前的Swift行为.


Col*_*inE 6

只有一个Array和一个Dictionary类型的斯威夫特.可变性取决于你如何构建它:

var mutableArray = [1,2,3]
let immutableArray = [1,2,3]
Run Code Online (Sandbox Code Playgroud)

即如果你创建一个变量赋值它是可变的,而如果你创建一个赋值给常量它不是.

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


iPa*_*tel 5

只需声明你的(任何)对象或变量

'let' key word -> for "constan/Immutable" array, dictionary, variable, object..etc.
Run Code Online (Sandbox Code Playgroud)

'var' key word -> for "Mutable" array, dictionary, variable, object..etc. 
Run Code Online (Sandbox Code Playgroud)

有关更深入的信息

"使用let来创建常量,使用var来创建变量.在编译时不需要知道常量的值,但是必须为其分配一次值.这意味着您可以使用常量来命名您确定一次但在许多地方使用的值."

var myVariable = 42
myVariable = 50
let myConstant = 42
Run Code Online (Sandbox Code Playgroud)

阅读"Swift编程语言".