欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Swift里的值類型與引用類型區(qū)別和使用

 更新時間:2015年05月25日 10:30:29   投稿:junjie  
這篇文章主要介紹了Swift里的值類型與引用類型區(qū)別和使用,本文講解了值類型與引用類型的區(qū)別、如何選擇類型、什么時候該用值類型、什么時候該用引用類型等內(nèi)容,需要的朋友可以參考下

Swift里面的類型分為兩種:

●值類型(Value Types):每個實(shí)例都保留了一分獨(dú)有的數(shù)據(jù)拷貝,一般以結(jié)構(gòu)體 (struct)、枚舉(enum) 或者元組(tuple)的形式出現(xiàn)。
●引用類型(Reference Type):每個實(shí)例共享同一份數(shù)據(jù)來源,一般以類(class)的形式出現(xiàn)。

在這篇博文里面,我們會介紹兩種類型各自的優(yōu)點(diǎn),以及應(yīng)該怎么選擇使用。

值類型與引用類型的區(qū)別

值類型和引用類型最基本的分別在復(fù)制之后的結(jié)果。當(dāng)一個值類型被復(fù)制的時候,相當(dāng)于創(chuàng)造了一個完全獨(dú)立的實(shí)例,這個實(shí)例保有屬于自己的獨(dú)有數(shù)據(jù),數(shù)據(jù)不會受到其他實(shí)例的數(shù)據(jù)變化影響:

復(fù)制代碼 代碼如下:

    // 下面是一個值類型的例子
    struct S { var data: Int = -1 }
    var a = S()
    var b = a                           // b是a的拷貝
    a.data = 42                         // 更改a的數(shù)據(jù),b的不受影響
    println("\(a.data), \(b.data)")     // 輸出結(jié)果 "42, -1"

值類型就好像身份證復(fù)印件一樣,復(fù)印出來之后,修改原件上面的內(nèi)容,復(fù)印件上的內(nèi)容不會變。

另一方面,復(fù)制一個引用類型的時候,實(shí)際上是默默地創(chuàng)造了一個共享的實(shí)例分身,兩者是共用一套數(shù)據(jù)。因此修改其中任何一個實(shí)例的數(shù)據(jù),也會影響到另外那個。

復(fù)制代碼 代碼如下:

    // 下面是一個引用類型的例子
    class C { var data: Int = -1 }
    var x = C()
    var y = x                           // y是x的拷貝
    x.data = 42                         // 更改x的數(shù)據(jù),等于同時修改了y
    println("\(x.data), \(y.data)")     // 輸出結(jié)果 "42, 42"

Mutation(修改)在安全中扮演的角色

值類型較引用類型來說,會讓你更容易在大量代碼中理清狀況。如果你總是得到一個獨(dú)立的拷貝出來的實(shí)例,你就可以放心它不會被你app里面的其他部分代碼默默地修改。這在多線程的環(huán)境里面是尤為重要的,因為另外一個線程可能會在暗地里修改你的數(shù)據(jù)。因此可能會造成嚴(yán)重的程序錯誤,這在調(diào)試過程中非常難以排除。

由于差別主要在于修改數(shù)據(jù)的后果,那么當(dāng)實(shí)例的數(shù)據(jù)只讀,不存在需要更改的情況下,用哪種類型都是沒有分別的。

你可能在想,有的時候我可能也需要一個完全不變的類。這樣使用Cocoa NSObject對象的時候會比較容易,又可以保留值語義的好處。在今天,你可以通過只使用不可變的存儲屬性,和避開任何可以修改狀態(tài)的API,用Swift寫出一個不可變類(immutable class)。實(shí)際上,很多基本的Cocoa類,例如NSURL,都是設(shè)計成不可變類的。然而,Swift語言目前只強(qiáng)制struct和enum這種值類型的不可變性,對類這種引用類型則沒有。(例如還不支持強(qiáng)制將子類的限制為不可變類)

如何選擇類型?

所以當(dāng)我們想要建立一個新的類型的時候,怎么決定用值類型還是引用類型呢?當(dāng)你使用Cocoa框架的時候,很多API都要通過NSObject的子類使用,所以這時候必須要用到引用類型class。在其他情況下,有下面幾個準(zhǔn)則:

什么時候該用值類型:

●要用==運(yùn)算符來比較實(shí)例的數(shù)據(jù)時
●你希望那個實(shí)例的拷貝能保持獨(dú)立的狀態(tài)時
●數(shù)據(jù)會被多個線程使用時

什么時候該用引用類型(class):

●要用==運(yùn)算符來比較實(shí)例身份的時候
●你希望有創(chuàng)建一個共享的、可變對象的時候

在Swift里面,數(shù)組(Array)、字符串(String)、字典(Dictionary)都屬于值類型。它們就像C語言里面簡單的int值,是一個個獨(dú)立的數(shù)據(jù)個體。你不需要花任何功夫來防范其他代碼在暗地里修改它們。更重要的是,你可以在線程之間安全的傳遞變量,而不需要特地去同步。在Swift高安全性的精神下,這個模式會幫助你用Swift寫出更可控的代碼。

相關(guān)文章

  • Swift3.0 GCD定時器的使用DEMO

    Swift3.0 GCD定時器的使用DEMO

    這篇文章主要介紹了Swift3.0 GCD定時器的使用,實(shí)現(xiàn)倒計時,UIDatePicker的使用, 仿寫一個活動倒計時的DEMO,需要的朋友可以參考下
    2017-02-02
  • 關(guān)于swift的個人小結(jié)

    關(guān)于swift的個人小結(jié)

    本文是個人對于目前學(xué)習(xí)swift的一些心得的匯總,這里分享給大家,希望大家能夠喜歡
    2016-12-12
  • 初步理解Swift中的泛型

    初步理解Swift中的泛型

    這篇文章主要介紹了初步理解Swift中的泛型,是Swift入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-07-07
  • Swift實(shí)現(xiàn)代碼混淆詳解

    Swift實(shí)現(xiàn)代碼混淆詳解

    本文詳細(xì)講解了Swift實(shí)現(xiàn)代碼混淆的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧<BR>
    2021-11-11
  • Swift?中的?RegexBuilder學(xué)習(xí)指南

    Swift?中的?RegexBuilder學(xué)習(xí)指南

    這篇文章主要為大家介紹了Swift中的RegexBuilder學(xué)習(xí)指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • 判斷?ScrollView List?是否正在滾動詳解

    判斷?ScrollView List?是否正在滾動詳解

    這篇文章主要為大家介紹了判斷?ScrollView、List?是否正在滾動示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Swift之UITabBarController 導(dǎo)航控制器的自定義

    Swift之UITabBarController 導(dǎo)航控制器的自定義

    本文給大家介紹swift導(dǎo)航控制器之UITabBarController,本文通過代碼實(shí)例給大家講解swift導(dǎo)航控制器,導(dǎo)航控制器類繼承UITabBarController,代碼簡單易懂,需要的朋友可以參考下
    2015-10-10
  • Swift教程之方法詳解

    Swift教程之方法詳解

    這篇文章主要介紹了Swift教程之方法詳解,方法是關(guān)聯(lián)到一個特定類型的函數(shù),類、結(jié)構(gòu)、枚舉所有可以定義實(shí)例方法,封裝特定任務(wù)和功能處理給定類型的一個實(shí)例,需要的朋友可以參考下
    2015-01-01
  • Swift Set集合及常用方法詳解總結(jié)

    Swift Set集合及常用方法詳解總結(jié)

    Set集合為集類型,集是最簡單的一種集合,存放于集中的對象不按特定方式排序,只是簡單地把對象加入集合中,類似于向口袋里放東西,對集中存在的對象的訪問和操作是通過對象的引用進(jìn)行的,因此在集中不能存放重復(fù)對象
    2021-11-11
  • swift實(shí)現(xiàn)顏色漸變以及轉(zhuǎn)換動畫

    swift實(shí)現(xiàn)顏色漸變以及轉(zhuǎn)換動畫

    這篇文章主要為大家詳細(xì)介紹了swift實(shí)現(xiàn)顏色漸變以及轉(zhuǎn)換動畫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評論