You indicate whether a particular
String
can be modified (or mutated) by assigning it to a variable (in which case it can be modified),or to a constant (in which case it cannot be modified):
并给出示例代码:
var variableString = "Horse" variableString += " and carriage" // variableString is now "Horse and carriage" let constantString = "Highlander" constantString += " and another Highlander" // this reports a compile-time error - a constant string cannot be modified”
这本书在iBooks here中,或在网络浏览器here中.
在下一段中,它声称“字符串是值类型”.
我的问题:这看起来不像我可变的字符串.它看起来像我在Java(或C#,Python和其他)中常用的:具有可变变量绑定的不可变字符串对象.换句话说,有一个对象“马”,然后创建一个新的String对象“马和马车”,并将其设置为相同的变量.而且由于没有办法说明对不可变对象的引用与值类型之间的区别(对吗?),我想知道为什么它们这样描述?这些Swift字符串和Java之间有什么区别吗? (或C#,Python,Objective-C / NSString)
例如,考虑一个类型为Int的var.这是可变的吗?有些人可能会说,可以通过分配(=)来更改其可见的“值”.但是,NSNumber和NSString的变量也可以相同 – 您可以通过分配给它来更改其可见值.但NSNumber和NSString被描述为不可变类.
引用类型真正发生的是分配给它们会导致变量(指针)指向一个新的对象.旧的和新的对象本身都不会“改变”,但由于它指向一个不同的对象,所以你“看到”一个新的值.
当我们说一个类是“可变的”时,我们的意思是它提供了一个API(方法或参考)来实际改变对象的内容.但是我们怎么知道对象已经改变了? (而是它是一个新对象?)这是因为我们可以对同一个对象有另一个引用,并且通过一个引用对对象的更改可以通过另一个引用来看到.但这些属性(指向不同对象,具有多个指向同一对象的指针)本质上仅适用于引用类型.根据定义,值类型不能具有这样的“共享”(除非“值”的一部分是Array中的引用类型),因此,值类型不会发生“可变性”的后果.
所以,如果你做一个包含整数的不变类,它将在操作上等价于Int – 在这两种情况下,更改变量值的唯一方法是将(=)赋值给它.所以,Int也应该被认为是“不变的”.
Swift中的值类型稍微复杂一点,因为它们可以有方法,其中一些可以是变异的.所以如果你可以调用一个值类型的变异方法,它是可变的吗?但是,如果我们考虑将值类型的变异方法称为语法糖,为其分配一个全新的值(无论使用哪种方法将其变异),我们都可以克服这一点.