1.首先進(jìn)行一下類和結(jié)構(gòu)體的對(duì)比:
共同點(diǎn):
定義屬性用于存儲(chǔ)值
定義方法用于提供功能
定義構(gòu)造器用于生成初始化值
通過擴(kuò)展增加默認(rèn)實(shí)現(xiàn)的功能
實(shí)現(xiàn)協(xié)議提供某種標(biāo)準(zhǔn)功能類還有更多功能:
允許繼承
引用計(jì)數(shù)允許對(duì)一個(gè)類的多次引用
2.實(shí)例化類和結(jié)構(gòu)體語(yǔ)法
class Some{}
struct SomeStuct{}
3.
結(jié)構(gòu)體中屬性的訪問通過點(diǎn)語(yǔ)法涕烧。
結(jié)構(gòu)體都有一個(gè)自動(dòng)生成的成員主意構(gòu)造器审胸。
-
結(jié)構(gòu)體和枚舉是值類型翅睛,創(chuàng)建多個(gè)結(jié)構(gòu)體對(duì)象事昌屉,是對(duì)值的復(fù)制订讼,而不是指向相同實(shí)例
struct SomeStru{ var width= 0 var height =0 } let some = SomeStru() some.width = 10 let one = some one.width = 20 print("\(one.width).....\(some.width)") // 20...10
在將some
賦值給one
時(shí),實(shí)際上是將some
里的值拷貝給了one
缸濒,將拷貝的值存入新的SomeStru
實(shí)例中妇拯。some
和one
相互獨(dú)立,不會(huì)影響互相的值脓钾。
- 類是引用類型售睹,在被賦值到一個(gè)變量或常量時(shí),值不會(huì)被拷貝可训,引用的是已經(jīng)存在的實(shí)例本身而不是值拷貝
4.恒等運(yùn)算符:判斷兩個(gè)常量或變量是否引用同一個(gè)實(shí)例
- 等價(jià)于
===
表示兩個(gè)類類型(class type)的常量或者變量引用同一個(gè)類實(shí)例 - 不等價(jià)于
昌妹!==
表示兩個(gè)實(shí)例的值“相等”或“相同”捶枢,判定時(shí)要遵照設(shè)計(jì)者定義的評(píng)判標(biāo)準(zhǔn),因此相對(duì)于“相等”來說飞崖,這是一種更加合適的叫法烂叔。
5.類和結(jié)構(gòu)體的選擇
以下考慮結(jié)構(gòu)體:
- 該數(shù)據(jù)結(jié)構(gòu)的主要目的是用來封裝少量相關(guān)簡(jiǎn)單數(shù)據(jù)值。
- 有理由預(yù)計(jì)該數(shù)據(jù)結(jié)構(gòu)的實(shí)例在被賦值或傳遞時(shí)固歪,封裝的數(shù)據(jù)將會(huì)被拷貝而不是被引用蒜鸡。
- 該數(shù)據(jù)結(jié)構(gòu)中儲(chǔ)存的值類型屬性,也應(yīng)該被拷貝牢裳,而不是被引用逢防。
- 該數(shù)據(jù)結(jié)構(gòu)不需要去繼承另一個(gè)既有類型的屬性或者行為。
6.字符串(String)贰健、數(shù)組(Array)、和字典(Dictionary)類型的賦值與復(fù)制行為
Swift 中恬汁,許多基本類型伶椿,諸如String,Array和Dictionary類型均以結(jié)構(gòu)體的形式實(shí)現(xiàn)氓侧。這意味著被賦值給新的常量或變量脊另,或者被傳入函數(shù)或方法中時(shí),它們的值會(huì)被拷貝约巷。
Objective-C 中NSString偎痛,NSArray和NSDictionary類型均以類的形式實(shí)現(xiàn),而并非結(jié)構(gòu)體独郎。它們?cè)诒毁x值或者被傳入函數(shù)或方法時(shí)踩麦,不會(huì)發(fā)生值拷貝,而是傳遞現(xiàn)有實(shí)例的引用氓癌。