1.首先進(jìn)行一下類(lèi)和結(jié)構(gòu)體的對(duì)比:
共同點(diǎn):
定義屬性用于存儲(chǔ)值
定義方法用于提供功能
定義構(gòu)造器用于生成初始化值
通過(guò)擴(kuò)展增加默認(rèn)實(shí)現(xiàn)的功能
實(shí)現(xiàn)協(xié)議提供某種標(biāo)準(zhǔn)功能類(lèi)還有更多功能:
允許繼承
引用計(jì)數(shù)允許對(duì)一個(gè)類(lèi)的多次引用
2.實(shí)例化類(lèi)和結(jié)構(gòu)體語(yǔ)法
class Some{}
struct SomeStuct{}
3.
結(jié)構(gòu)體中屬性的訪問(wèn)通過(guò)點(diǎn)語(yǔ)法。
結(jié)構(gòu)體都有一個(gè)自動(dòng)生成的成員主意構(gòu)造器。
-
結(jié)構(gòu)體和枚舉是值類(lèi)型,創(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ì)影響互相的值。
- 類(lèi)是引用類(lèi)型,在被賦值到一個(gè)變量或常量時(shí),值不會(huì)被拷貝,引用的是已經(jīng)存在的實(shí)例本身而不是值拷貝
4.恒等運(yùn)算符:判斷兩個(gè)常量或變量是否引用同一個(gè)實(shí)例
- 等價(jià)于
===
表示兩個(gè)類(lèi)類(lèi)型(class type)的常量或者變量引用同一個(gè)類(lèi)實(shí)例 - 不等價(jià)于
!==
表示兩個(gè)實(shí)例的值“相等”或“相同”,判定時(shí)要遵照設(shè)計(jì)者定義的評(píng)判標(biāo)準(zhǔn),因此相對(duì)于“相等”來(lái)說(shuō),這是一種更加合適的叫法。
5.類(lèi)和結(jié)構(gòu)體的選擇
以下考慮結(jié)構(gòu)體:
- 該數(shù)據(jù)結(jié)構(gòu)的主要目的是用來(lái)封裝少量相關(guān)簡(jiǎn)單數(shù)據(jù)值。
- 有理由預(yù)計(jì)該數(shù)據(jù)結(jié)構(gòu)的實(shí)例在被賦值或傳遞時(shí),封裝的數(shù)據(jù)將會(huì)被拷貝而不是被引用。
- 該數(shù)據(jù)結(jié)構(gòu)中儲(chǔ)存的值類(lèi)型屬性,也應(yīng)該被拷貝,而不是被引用。
- 該數(shù)據(jù)結(jié)構(gòu)不需要去繼承另一個(gè)既有類(lèi)型的屬性或者行為。
6.字符串(String)、數(shù)組(Array)、和字典(Dictionary)類(lèi)型的賦值與復(fù)制行為
Swift 中,許多基本類(lèi)型,諸如String,Array和Dictionary類(lèi)型均以結(jié)構(gòu)體的形式實(shí)現(xiàn)。這意味著被賦值給新的常量或變量,或者被傳入函數(shù)或方法中時(shí),它們的值會(huì)被拷貝。
Objective-C 中NSString,NSArray和NSDictionary類(lèi)型均以類(lèi)的形式實(shí)現(xiàn),而并非結(jié)構(gòu)體。它們?cè)诒毁x值或者被傳入函數(shù)或方法時(shí),不會(huì)發(fā)生值拷貝,而是傳遞現(xiàn)有實(shí)例的引用。