let / var如何解决可变性?

时间:2017-08-09 09:35:49

标签: objective-c arrays swift immutability

我没有任何问题,我想就可变性问题做一些澄清。

在Objective-C中,我们将使用例如NSMutableArray来获取可变数组,使用NSArray来获取不可变数组。我对这两者的内部运作情况了解不多,但从我记忆中的情况来看,我认为不同之处在于NSArray仅保留了一定的初始值内存量,这使得它更有效率,而NSMutableArray不知道它需要多少内存。据推测,这意味着NSMutableArray指向了所有位置的内存位,而不是像NSArray那样一个接一个的指针?或者它可能只是保留了大量的内存,希望它不会耗尽?

在Swift中,明显的替换是let表示不可变,var表示可变。如果使用这些关键字声明变量,我认为Swift和Objective-C之间没有区别。但是,如果我声明没有var / let的变量,例如将其存储在另一个变量中,我不明白它是如何工作的。

假设我有一个字典,例如[String: [String]]。换句话说,对于每个字符串键,都有一个字符串数组。考虑以下情况:

var dictionary: [String: [String]] = [:]
dictionary["key"] = ["string0", "string1"]

//dictionary now is ["key": ["string0", "string1"]]

但是现在的字符串数组是什么?这是可变的,因为字典是可变的吗?它是可变的,因为我们指定的一切都是可变的吗?以下案例怎么样:

let dictionary = ["key": ["string0", "string1"]]
dictionary["key"].append("string2")

这会有用吗?

我想关键问题是在Objective-C中我总是定义我是否使用NSMutableArrayNSArray。使用文字语法[@"string"]创建数组总是会导致NSArray,除非我指定它,否则它不会是可变的。在Swift中,我不知道什么时候是可变的。

由于

2 个答案:

答案 0 :(得分:3)

对于数组和字典,letvar关键字决定整个集合是可变的还是不可变的。换句话说,如果使用let关键字声明字典不可变,则不能更改其任何值,因此第二个示例将不起作用。

Swift中,决定集合是可变的还是不可变的只取决于用于声明它的关键字,因此使用let关键字声明数组/字典将等同于声明不可变的数组(Objective-C中的NSArray),同时使用var关键字声明它将为您提供一个可变数组(Objective-C中的NSMutableArray)。

答案 1 :(得分:1)

  

如果您创建数组,集合或字典,并将其分配给a   变量,创建的集合将是可变的。这意味着   您可以在创建集合后更改(或更改)集合   添加,删除或更改集合中的项目。如果你指定   数组,集合或字典到常量,该集合是   不可变的,它的大小和内容不能改变。

所以,let表示常量,如果使用let声明数组或字典,它将是不可变的。

如果将数组或字典声明为var,它将是可变的。

因此,下面的情况将不起作用,因为字典将是不可变的:

let dictionary = ["key": ["string0", "string1"]]
dictionary["key"].append("string2")

检查此处的参考:

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html