Objective c let/var如何解决可变性?

Objective c let/var如何解决可变性?,objective-c,arrays,swift,immutability,Objective C,Arrays,Swift,Immutability,我没有任何问题,我只是想澄清一下关于可变性的问题 在Objective-C中,我们将使用NSMutableArray获得可变数组,使用NSArray获得不可变数组。我不太了解这两者的内部工作原理,但从我的记忆中我相信区别在于NSArray只保留了特定于初始值的内存量,这使得它更高效,而NSMutableArray不知道它需要多少内存。这可能意味着NSMutableArray有指向内存位的指针,这些内存位到处都是,而不是像NSArray那样一个接一个?或者它只是保留了大量的内存,希望不会用完 在S

我没有任何问题,我只是想澄清一下关于可变性的问题

在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")
但是现在字符串数组是什么?因为字典是可变的,所以它是可变的吗?它是可变的,因为我们分配的所有东西都是可变的吗?以下情况如何:

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,除非我指定它,否则它是不可变的。在斯威夫特我不知道什么时候是可变的


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

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

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

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

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

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

let dictionary = ["key": ["string0", "string1"]]
dictionary["key"].append("string2")
请检查此处的参考: