Swift中的值类型和引用类型

时间:2017-05-26 07:23:10

标签: swift

根据Apple文档 String 是Struct(值类型), NSString 是Class(引用类型)。引用类型意味着如果我们更改引用的值,它也将反映在原始值中。 检查以下代码。

任何人都可以解释一下下面代码的输出是什么以及为什么?

import UIKit

var str:NSString = "Hello, playground"

var newStr = str

newStr = "hello"

print(str)
print(newStr)

根据我的说法,str和newStr都应该打印 hello ,因为它们是引用类型,但输出是

  

你好,游乐场

     

您好

2 个答案:

答案 0 :(得分:5)

首先,NSString是不可变的,因此虽然它是引用类型,但不能更改。

现在,当您说var str:NSString = "Hello, playground"时,您将str设置为对常量字符串的引用" Hello,playground"。

然后您有var newStr = str,因此newStrstr都会引用相同的常量字符串。

最后你有newStr = "hello",所以newStr现在引用一个不同的常量字符串。在任何时候你都没有修改原始常量字符串" Hello,playground",实际上你不能,因为它既是常量也是不可变类。

但是,如果您使用NSMutableString并写:

var str:NSMutableString = NSMutableString(string:"Hello, playground")

var newStr = str

newStr.append(". Hello")

print(str)
print(newStr)

然后你会得到输出

  

你好,操场。你好

     

你好,操场。你好

由于您正在修改两个变量引用的一个对象。

答案 1 :(得分:3)

  

参考类型意味着如果我们更改引用的值,它也会反映在原始值中。

是的,这是事实。但是,在代码newStr = "hello"中,您并非更改引用类型的值。正如Paulw11在评论newStr = "hello"中指出的那样,将newStr指定为对不同常量字符串的引用。

让我们说str指向并指向0xAAAA。

var newStr = str会导致newStr指向0xAAAA。

newStr = "hello"现在指向常量字符串hello的另一个地址。假设地址是0xBBBB

正如您所看到的,str指向0xAAAA而newStr指向0xBBBB,因此它们必然会产生不同的结果。