2017-05-26 106 views
2

根据Apple文档字符串是一个Struct(值类型)和NSString是Class(引用类型)。引用类型意味着如果我们更改引用的值,它也会反映到原始值中。 检查下面的代码。Swift中的值类型和引用类型

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

import UIKit 

var str:NSString = "Hello, playground" 

var newStr = str 

newStr = "hello" 

print(str) 
print(newStr) 

据我既海峡和中newstr应打印你好,因为它们是引用类型,但输出

你好,操场

你好

+3

'newStr =“hello”'指定'newStr'作为不同常量字符串的引用。 'str'仍然指原始字符串 – Paulw11

回答

5

第一,NSString是不可变的,所以尽管它是一个引用类型,但它不能被改变。

现在,当你说var str:NSString = "Hello, playground"你设置str作为一个常量字符串“你好,操场”的引用。

然后您有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) 

然后你会得到输出

你好,游乐场。你好

你好,操场。您好

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

+0

谢谢...带走我的upvote –

3

引用类型表示如果我们更改引用的值,它也会反映到原始值中。

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

假设str指向并且地址0xAAAA。

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

newStr = "hello"现在指向另一个恒定字符串hello的地址。可以说地址是0xBBBB

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

+0

谢谢.......... –