程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> Swift裡的值類型與援用類型差別和應用

Swift裡的值類型與援用類型差別和應用

編輯:更多關於編程

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寫出更可控的代碼。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved