2017-05-26 38 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

謝謝.......... –