当前位置: 首页 > 面试题库 >

Swift“可变”字符串真的可变吗,还是就像Java字符串一样?

祝嘉懿
2023-03-14
问题内容

“ 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”

这本书中的iBooks
这里,或在Web浏览器在这里。

在下一段中,它声称“字符串是值类型”。

我的问题:对我来说,这看起来像个可变的字符串。看起来就像我在Java(或C#,Python和其他语言)中所惯用的:具有可变变量绑定的不可变字符串对象。换句话说,有一个对象“马”,然后它创建了一个新的字符串对象“马和马车”,并将其设置为相同的变量。而且由于无法分辨不可变对象的引用与值类型之间的区别(对吗?),我想知道:为什么他们这样描述它?这些Swift字符串与其在Java中的方式之间有什么区别吗?(或C#,Python,Objective-C
/ NSString)


问题答案:

以某种方式,“可变”和“不可变”仅在谈论引用类型时才有意义。如果您尝试将其扩展为值类型,则可以将所有值类型在功能上等同于“不可变”引用类型。

例如,考虑一种var类型Int。这是可变的吗?你们中的某些人肯定会说-您可以通过为其分配(=)来更改其可见的“值”
。然而,同样可以的可以说varNSNumberNSString-您可以通过分配给它改变它的可见价值。但是NSNumberNSString被描述为
不可变的 类。

引用类型真正发生的事情是,给它们赋值会导致变量(指针)指向新对象。旧对象或新对象本身都不会“更改”,但是由于它指向另一个对象,因此您“看到”了一个新值。

当我们说一个类是“可变的”时,我们的意思是它提供了一个API(方法或引用)来实际改变对象的内容。但是,我们如何知道对象已更改?(而不是它是一个新对象?)这是因为我们可以对同一对象有另一个引用,并且通过一个引用对对象的更改可以通过另一个引用看到。但是这些属性(指向不同的对象,具有指向同一对象的多个指针)本质上仅适用于引用类型。根据定义,值类型不能具有这样的“共享”(除非“值”的一部分是引用类型,如中的Array),因此,值类型不会发生“可变性”的结果。

因此,如果您制作了一个包装整数的不可变类,则在操作上它等效于Int-在两种情况下,更改变量值的唯一方法是为其分配(=)。因此,Int同样应将其视为“不变的”。

Swift中的值类型稍微复杂一些,因为它们可以具有方法,其中一些可以是mutating。因此,如果可以mutating在值类型上调用方法,则该方法可变吗?但是,如果我们考虑mutating将值类型上的方法称为语法糖来为其分配一个全新的值(无论该方法将其突变为什么),我们都可以克服。



 类似资料:
  • 问题内容: 我们都知道这String在Java 中是不可变的,但是请检查以下代码: 为什么该程序会这样运行?为何值和改变了,但没有改变? 问题答案: 是不可变的*,但这仅意味着你无法使用其公共API对其进行更改。 你在这里所做的是使用反射来绕过常规API。同样,你可以更改枚举的值,更改整数自动装箱中使用的查找表等。 现在,原因s1和s2变化值是它们都引用相同的实习字符串。编译器执行此操作(如其他答

  • 我们都知道在Java中是不可变的,但是检查下面的代码: 为什么这个程序会这样操作?为什么和的值被更改了,而却没有被更改?

  • 本文向大家介绍Java中的不可变字符串,包括了Java中的不可变字符串的使用技巧和注意事项,需要的朋友参考一下 在Java中,不可变对象是指那些不能更改或修改(一旦修改)数据的对象。字符串类是不可变的,即一旦我们创建了一个字符串对象,就无法修改其数据。

  • 据我所知, 可变字符串可以更改,不可变字符串不能更改。 这里我想这样改变字符串的值, 另一种方法是, 在这两种情况下,我都试图改变str的值。谁能告诉我,这两种情况的区别是什么,让我清楚地了解可变和不可变对象。

  • 为什么Java字符串被认为是不可变的?我可以说之后将name值更改为

  • 本文向大家介绍不是说字符串是不可变的吗?string s="abc";s="123"不就是变了吗?相关面试题,主要包含被问及不是说字符串是不可变的吗?string s="abc";s="123"不就是变了吗?时的应答技巧和注意事项,需要的朋友参考一下 String是不可变的在这段代码中,s原先指向一个String对象,内容是 "abc",然后我们将s指向"123",那么s所指向的那个对象是否发生了