Swift裡的值類型與援用類型差別和應用。本站提示廣大學習愛好者:(Swift裡的值類型與援用類型差別和應用)文章只能為提供參考,不一定能成為您想要的結果。以下是Swift裡的值類型與援用類型差別和應用正文
Swift外面的類型分為兩種:
●值類型(Value Types):每一個實例都保存了一分獨有的數據拷貝,普通以構造體 (struct)、列舉(enum) 或許元組(tuple)的情勢湧現。
●援用類型(Reference Type):每一個實例同享統一份數據起源,普通以類(class)的情勢湧現。
在這篇博文外面,我們會引見兩品種型各自的長處,和應當怎樣選擇應用。
值類型與援用類型的差別
值類型和援用類型最根本的分離在復制以後的成果。當一個值類型被復制的時刻,相當於發明了一個完整自力的實例,這個實例保有屬於本身的獨稀有據,數據不會遭到其他實例的數據變更影響:
// 上面是一個值類型的例子
struct S { var data: Int = -1 }
var a = S()
var b = a // b是a的拷貝
a.data = 42 // 更改a的數據,b的不受影響
println("\(a.data), \(b.data)") // 輸入成果 "42, -1"
值類型就似乎身份證復印件一樣,復印出來以後,修正原件下面的內容,復印件上的內容不會變。
另外一方面,復制一個援用類型的時刻,現實上是默默地發明了一個同享的實例兩全,二者是共用一套數據。是以修正個中任何一個實例的數據,也會影響到別的誰人。
// 上面是一個援用類型的例子
class C { var data: Int = -1 }
var x = C()
var y = x // y是x的拷貝
x.data = 42 // 更改x的數據,等於同時修正了y
println("\(x.data), \(y.data)") // 輸入成果 "42, 42"
Mutation(修正)在平安中飾演的腳色
值類型較援用類型來講,會讓你更輕易在年夜量代碼中理清狀態。假如你老是獲得一個自力的拷貝出來的實例,你便可以寧神它不會被你app外面的其他部門代碼默默地修正。這在多線程的情況外面是尤其主要的,由於別的一個線程能夠會在背後修正你的數據。是以能夠會形成嚴重的法式毛病,這在調試進程中異常難以消除。
因為差異重要在於修正數據的效果,那末當實例的數據只讀,不存在須要更改的情形下,用哪一種類型都是沒有分離的。
你能夠在想,有的時刻我能夠也須要一個完整不變的類。如許應用Cocoa NSObject對象的時刻會比擬輕易,又可以保存值語義的利益。在明天,你可以經由過程只應用弗成變的存儲屬性,和避開任何可以修正狀況的API,用Swift寫出一個弗成變類(immutable class)。現實上,許多根本的Cocoa類,例如NSURL,都是設計成弗成變類的。但是,Swift說話今朝只強迫struct和enum這類值類型的弗成變性,對類這類援用類型則沒有。(例如還不支撐強迫將子類的限制為弗成變類)
若何選擇類型?
所以當我們想要樹立一個新的類型的時刻,怎樣決議用值類型照樣援用類型呢?當你應用Cocoa框架的時刻,許多API都要經由過程NSObject的子類應用,所以這時候候必需要用到援用類型class。在其他情形下,有上面幾個原則:
甚麼時刻該用值類型:
●要用==運算符來比擬實例的數據時
●你願望誰人實例的拷貝能堅持自力的狀況時
●數據會被多個線程應用時
甚麼時刻該用援用類型(class):
●要用==運算符來比擬實例身份的時刻
●你願望有創立一個同享的、可變對象的時刻
在Swift外面,數組(Array)、字符串(String)、字典(Dictionary)都屬於值類型。它們就像C說話外面簡略的int值,是一個個自力的數據個別。你不須要花任何工夫來防備其他代碼在背後修正它們。更主要的是,你可以在線程之間平安的傳遞變量,而不須要專程去同步。在Swift高平安性的精力下,這個形式會贊助你用Swift寫出更可控的代碼。