我没有任何问题,我想就可变性问题做一些澄清。
在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中我总是定义我是否使用NSMutableArray
或NSArray
。使用文字语法[@"string"]
创建数组总是会导致NSArray
,除非我指定它,否则它不会是可变的。在Swift中,我不知道什么时候是可变的。
由于
答案 0 :(得分:3)
对于数组和字典,let
或var
关键字决定整个集合是可变的还是不可变的。换句话说,如果使用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")
检查此处的参考: