Swift“可变”字符串是否可变,或者它们是否像Java字符串一样?

前端之家收集整理的这篇文章主要介绍了Swift“可变”字符串是否可变,或者它们是否像Java字符串一样?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Swift编程语言中,在Strings部分字符串Mutability中,它说:

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中的值类型稍微复杂一点,因为它们可以有方法,其中一些可以是变异的.所以如果你可以调用一个值类型的变异方法,它是可变的吗?但是,如果我们考虑将值类型的变异方法称为语法糖,为其分配一个全新的值(无论使用哪种方法将其变异),我们都可以克服这一点.

猜你在找的Swift相关文章