亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么選擇結構而不是班級?

為什么選擇結構而不是班級?

DIEA 2019-07-03 11:04:58
為什么選擇結構而不是班級?玩SWIFT,來自Java背景,你為什么要選擇一個Struct而不是一個類呢?看起來他們是一樣的東西,結構提供較少的功能。那為什么要選呢?
查看完整描述

3 回答

?
慕容森

TA貢獻1853條經驗 獲得超18個贊

根據非常流行的WWDC 2015對話協議編程,在SWIFT(視頻成績單),SWIFT提供了許多特性,使結構在許多情況下優于類。

如果結構相對較小且可復制,則結構更可取,因為復制比對同一個實例的多個引用要安全得多,就像類一樣。在將變量傳遞給許多類和/或多線程環境中時,這一點尤為重要。如果您總是可以將變量的副本發送到其他地方,則不必擔心另一個地方更改您下面變量的值。

有了Structs,就不需要擔心內存泄漏或多線程爭先恐后地訪問/修改變量的單個實例了。(對于技術上來說,這方面的例外是在閉包中捕獲一個結構,因為它實際上是捕獲對實例的引用,除非您顯式地標記為要復制它)。

類也可能膨脹,因為類只能從單個超類繼承。這鼓勵我們創建巨大的超類,包含許多不同的能力,而這些能力只是松散相關的。使用協議,特別是與協議擴展一起使用協議,可以為協議提供實現,從而消除了類來實現此類行為的需要。

討論中列出了一些首選類的場景:

  • 復制或比較實例沒有意義(例如,窗口)
  • 實例生存期與外部影響相關聯(例如,TemporaryFile)
  • 實例只是“接收器”-只寫到外部狀態的管道(例如CGContext)。

這意味著結構應該是默認的,類應該是備用的。

另一方面,SWIFT編程語言文件有些矛盾:

結構實例總是通過值傳遞,類實例總是通過引用傳遞。這意味著它們適合于不同類型的任務。在考慮項目所需的數據結構和功能時,請確定每個數據結構應該定義為類還是結構。

作為一般指導方針,考慮在下列一個或多個條件適用時創建一個結構:

  • 該結構的主要目的是封裝一些相對簡單的數據值。
  • 在分配或傳遞該結構的實例時,可以合理地預期封裝的值將被復制,而不是引用。
  • 結構存儲的任何屬性本身都是值類型,它們也將被復制而不是引用。
  • 該結構不需要從另一個現有類型繼承屬性或行為。

良好的結構候選例子包括:

  • 幾何形狀的大小,可能封裝了一個寬度屬性和一個高度屬性,兩者都屬于Double類型。
  • 一種在系列中引用范圍的方法,可能會封裝Int類型的Start屬性和Length屬性。
  • 三維坐標系中的一個點,可能封裝了x、y和z的屬性,每個屬性都是Double類型的。

在所有其他情況下,定義一個類,并創建要通過引用管理和傳遞的該類實例。實際上,這意味著大多數自定義數據構造應該是類,而不是結構。

在這里,它聲稱我們應該默認使用類,并且只在特定的情況下使用結構。最終,您需要了解值類型與引用類型的真實含義,然后您可以對何時使用結構或類做出明智的決定。此外,請記住,這些概念一直在發展,SWIFT編程語言文檔是在面向協議的編程演講之前編寫的。


查看完整回答
反對 回復 2019-07-03
  • 3 回答
  • 0 關注
  • 557 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號