【发布时间】:2014-08-04 23:38:36
【问题描述】:
在Swift 编程语言中,在字符串部分的字符串可变性小节中,它是这样说的:
您可以通过将特定
String分配给变量(在这种情况下可以修改)或常量(在这种情况下它不能修改):
并给出示例代码:
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”
在下一段中,它声称“字符串是值类型”。
我的问题:对我来说,这看起来不像是一个可变字符串。它看起来就像我在 Java(或 C#、Python 等)中所习惯的:具有可变变量绑定的不可变字符串对象。换句话说,有一个对象“马”,然后它创建了一个新的字符串对象“马和马车”,并将其设置为相同的变量。而且由于无法区分对不可变对象的引用与值类型之间的区别(对吗?),我想知道:他们为什么要这样描述它?这些 Swift 字符串和它在 Java 中的方式有什么区别吗? (或 C#、Python、Objective-C/NSString)
【问题讨论】:
-
他们的描述不正确。他们真正谈论的是Java中的最终变量与非最终变量。这里没有字符串可变性。
-
Apple 文档还说:“在幕后,Swift 的编译器优化了字符串的使用,因此只有在绝对必要时才会进行实际的复制。这意味着当使用字符串作为值类型时,您总是可以获得出色的性能”。对我来说,编译器似乎在后台决定是否将其复制取决于您使用字符串的方式。
-
如果您准确地定义了“可变”和“不可变”的含义,将会很有帮助。我理解它的方式不是(常量或变量的)名称或不可变的值 - 它是它们之间的匹配。调用可变的只是意味着变量名称可以在初始设置后与新值匹配。调用不可变的东西只是意味着常量名称在最初设置后无法与新值匹配。也许我误解了什么,但这就是我理解可变性的方式。
-
好问题.. 以及非常草率的 Swift 文档措辞。它混合了 objects 的可变性(可以观察到)和 bindings。
-
我认为this screenshot from a Playground 说了很多关于 Swift 中“变异”字符串的各种方式的情况。
标签: string swift immutability