Swift 3.0之九通孽、類和結(jié)構(gòu)體

1. 類和結(jié)構(gòu)體對比

都能干的事兒:

  • 定義屬性用來存儲值
  • 定義方法用于提供功能
  • 定義下標腳本用來允許使用下標語法訪問值
  • 定義初始化器用于初始化狀態(tài)
  • 可以被擴展來默認所沒有的功能
  • 遵循協(xié)議來針對特定類型提供標準功能

類能干但結(jié)構(gòu)體不能干的事兒:

  • 繼承允許一個類繼承另一個類的特征
  • 類型轉(zhuǎn)換允許你在運行檢查和解釋一個類實例的類型
  • 反初始化器允許一個類實例釋放任何其所被分配的資源
  • 引用計數(shù)允許不止一個對類實例的引用

注意:
1.在Swift一個文件中定義一個類或者結(jié)構(gòu)體,系統(tǒng)自動生成面向其他代碼的外部接口抵碟。
2.結(jié)構(gòu)體在你的代碼中通過復制(淺拷貝)來傳遞,并不會使用引用計數(shù)。

語法:

  class SomeClass {
      // 類定義使用class關鍵字
  }  
  
  struct SomeStructure {
      // 結(jié)構(gòu)體定義使用struct關鍵字
  }

舉個栗子:

  struct Resolution {
      var width = 0
      var height = 0 
  }
  
  class VideoMode {
      var resolution = Resolution()  // 變量resolution默認值為結(jié)構(gòu)體Resolution實例
      var interlaced = false
      var frameRate = 0.0
      var name: String?  // 變量name默認值為nil
  }

上面定義僅僅描述了類或者結(jié)構(gòu)體的統(tǒng)一構(gòu)成耸序,但需要實例化才能在計算機內(nèi)存中生成具體的對象實例。簡單創(chuàng)建類和結(jié)構(gòu)體實例:

let someResolution = Resolution()
let someVideoMode = VideoMode()
// someResolution 和 someVideoMode 實例中的屬性為類和結(jié)構(gòu)體定義中的默認值

使用點語法來訪問屬性:

print("The width of someResolution is \(someResolution.width)")
// 結(jié)果為: "The width of someResolution is 0"

print("The width of someVideoMode is \(someVideoMode.resolution.width)")
// 結(jié)果為: "The width of someVideoMode is 0"

// 為屬性賦一個新值
someVideoMode.resolution.width = 1280
print("The width of someVideoMode is now \(someVideoMode.resolution.width)")
// 結(jié)果為: "The width of someVideoMode is now 1280"

注意: 不同于Objective-C鲁猩,Swift允許直接設置一個結(jié)構(gòu)體屬性中的子屬性坎怪。上述最后一個栗子中,someVideoModeresolution屬性中的width這個屬性可以直接設置廓握,不用重新給resolution屬性設置一個新值搅窿。

2. 結(jié)構(gòu)體和枚舉是值類型

Swift中所有的基本類型——整數(shù),浮點數(shù)隙券,布爾量男应,字符串,數(shù)組和字典——都是值類型娱仔,并且都以結(jié)構(gòu)體的形式在后臺實現(xiàn)沐飘。值類型賦值時直接采用原實例的拷貝,而非原實例牲迫。
舉個栗子:

let hd = Resolution(width: 1920, height: 1080) // 創(chuàng)建一個結(jié)構(gòu)體實例hd
var cinema = hd                                // 將實例的拷貝賦值給cinema

cinema.width = 2048                         // 更改cinema中width屬性值

println("cinema is now \(cinema.width) pixels wide")
//結(jié)果為: "cinema is now 2048 pixels wide"
  
print("hd is still \(hd.width) pixels wide")   // hd中的width屬性并不會受影響
// 結(jié)果為: "hd is still 1920 pixels wide"

3. 類是引用類型

引用類型賦值時耐朴,直接引用原實例對象,因此被賦值的任何變量都在更改唯一的一個實例盹憎。
舉個栗子:

// 創(chuàng)建一個VideoMode實例tenEighty并設置其屬性
let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0

// 將tenEighty對象賦值給alsoTenEighty
let alsoTenEighty = tenEighty

// 更改alsoTenEighty的frameRate屬性值為30.0
alsoTenEighty.frameRate = 30.0

// 發(fā)現(xiàn)筛峭,tenEighty的frameRate屬性值也變成了30.0.
print("The frameRate property of tenEighty is now \(tenEighty.frameRate)")
// 結(jié)果為: "The frameRate property of tenEighty is now 30.0"

// 結(jié)論: tenEighty 和 alsoTenEighty 指向同一個實例。

=====運算符:

  • "==" 對比兩邊的值是否相等
  • "===" 對比兩邊的對象是否引用自同一個類的實例

4. 類和結(jié)構(gòu)體之間的選擇

結(jié)構(gòu)體實例總是通過值來傳遞陪每,而類實例總是通過引用來傳遞影晓。

何時采用結(jié)構(gòu)體:

  • 結(jié)構(gòu)體的主要目的是為了封裝一些相關的簡單數(shù)據(jù)值
  • 當你在賦予或者傳遞結(jié)構(gòu)實例時镰吵,有理由需要封裝的數(shù)據(jù)值被拷貝而不是引用
  • 任何存儲在結(jié)構(gòu)體中的屬性是值類型,也將被拷貝而不是被引用
  • 結(jié)構(gòu)體不需要從一個已存在類型繼承屬性或者行為

比如以下情況常用結(jié)構(gòu)體封裝:

  • 幾何形狀的大小俯艰,可能封裝了一個width屬性和height屬性捡遍,兩者都為double類型
  • 一定范圍的路徑,可能封裝了一個start屬性和length屬性竹握,兩者為Int類型
  • 三維坐標系的一個點画株,可能封裝了x , yz屬性,都是double類型

在其他的情況下啦辐,定義一個類谓传,并創(chuàng)建這個類的實例,通過引用來管理和傳遞芹关。
事實上续挟,大部分的自定義的數(shù)據(jù)結(jié)構(gòu)應該是類,而不是結(jié)構(gòu)體侥衬。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诗祸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子轴总,更是在濱河造成了極大的恐慌直颅,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怀樟,死亡現(xiàn)場離奇詭異功偿,居然都是意外死亡,警方通過查閱死者的電腦和手機往堡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門械荷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人虑灰,你說我怎么就攤上這事吨瞎。” “怎么了穆咐?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵颤诀,是天一觀的道長。 經(jīng)常有香客問我庸娱,道長着绊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任熟尉,我火速辦了婚禮归露,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘斤儿。我一直安慰自己剧包,他們只是感情好恐锦,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著疆液,像睡著了一般一铅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上堕油,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天潘飘,我揣著相機與錄音,去河邊找鬼掉缺。 笑死卜录,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的眶明。 我是一名探鬼主播艰毒,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼搜囱!你這毒婦竟也來了丑瞧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蜀肘,失蹤者是張志新(化名)和其女友劉穎绊汹,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幌缝,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡灸促,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年诫欠,在試婚紗的時候發(fā)現(xiàn)自己被綠了涵卵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡荒叼,死狀恐怖轿偎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情被廓,我是刑警寧澤坏晦,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站嫁乘,受9級特大地震影響昆婿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蜓斧,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一仓蛆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挎春,春花似錦看疙、人聲如沸豆拨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽施禾。三九已至,卻和暖如春搁胆,著一層夾襖步出監(jiān)牢的瞬間弥搞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工渠旁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拓巧,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓一死,卻偏偏與公主長得像肛度,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子投慈,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容