根据Apple文档 String 是Struct(值类型), NSString 是Class(引用类型)。引用类型意味着如果我们更改引用的值,它也将反映在原始值中。 检查以下代码。
任何人都可以解释一下下面代码的输出是什么以及为什么?
import UIKit
var str:NSString = "Hello, playground"
var newStr = str
newStr = "hello"
print(str)
print(newStr)
根据我的说法,str和newStr都应该打印 hello ,因为它们是引用类型,但输出是
你好,游乐场
您好
答案 0 :(得分:5)
首先,NSString
是不可变的,因此虽然它是引用类型,但不能更改。
现在,当您说var str:NSString = "Hello, playground"
时,您将str
设置为对常量字符串的引用" Hello,playground"。
然后您有var newStr = str
,因此newStr
和str
都会引用相同的常量字符串。
最后你有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,因此它们必然会产生不同的结果。