Class 與 struct
結(jié)構(gòu)體和類作為一種通用而又靈活的結(jié)構(gòu)此洲,成為了人們構(gòu)建代碼的基礎(chǔ)。你可以使用定義常量娶桦、變量和函數(shù)的語法衷畦,為你的結(jié)構(gòu)體和類定義屬性知牌、添加方法祈争。
Class 與 struct 相同之處
1、定義屬性用于存儲(chǔ)值
2角寸、定義方法用于提供功能
3菩混、定義下標(biāo)操作用于通過下標(biāo)語法訪問它們的值
4忿墅、定義構(gòu)造器用于設(shè)置初始值
5、通過擴(kuò)展以增加默認(rèn)實(shí)現(xiàn)之外的功能
6沮峡、遵循協(xié)議以提供某種標(biāo)準(zhǔn)功能
7疚脐、類和結(jié)構(gòu)體在創(chuàng)建實(shí)例時(shí),必須為所有存儲(chǔ)型屬性設(shè)置合適的初始值
8邢疙、如果結(jié)構(gòu)體或類為所有屬性提供了默認(rèn)值棍弄,又沒有提供任何自定義的構(gòu)造器疟游,那么 Swift 會(huì)給這些結(jié)構(gòu)體或類提供一個(gè)默認(rèn)構(gòu)造器照卦。這個(gè)默認(rèn)構(gòu)造器將簡單地創(chuàng)建一個(gè)所有屬性值都設(shè)置為它們默認(rèn)值的實(shí)例
Class 與 struct 不同之處
對于類class和結(jié)構(gòu)體,主要理解的是他們的不同之處乡摹,這樣在平常的開發(fā)使用當(dāng)中役耕,可以清晰的知道什么時(shí)候用類class或者struct結(jié)構(gòu)體,下面就說說它們之間有哪些不同之處聪廉。
1瞬痘、class類可以繼承自父類,而struct結(jié)構(gòu)體不可以繼承板熊,如下代碼截圖
2框全、class類是引用類型,引用類型在被賦予到一個(gè)變量干签、常量或者被傳遞到一個(gè)函數(shù)時(shí)津辩,其值不會(huì)被拷貝。因此容劳,使用的是已存在實(shí)例的引用喘沿,而不是其拷貝。
struct結(jié)構(gòu)體是值類型竭贩,當(dāng)它被賦值給一個(gè)變量蚜印、常量或者被傳遞給一個(gè)函數(shù)的時(shí)候,其值會(huì)被拷貝留量。
看下面代碼截圖:
上面的代碼同時(shí)創(chuàng)建了一個(gè)結(jié)構(gòu)體StudentStruct和一個(gè)類StudentClass,并且都有一個(gè)變量iValue窄赋,在上面的代碼中,可以看到楼熄,分別創(chuàng)建了firstStruct結(jié)構(gòu)體對象和firstClass類對象忆绰,然后把這個(gè)兩個(gè)對象分別賦值給cpFirstStruct和cpFirstClass,在18和19代碼行可以看到可岂,更改了cpFirstStruct和cpFirstClass的值错敢,打印出來的結(jié)果是指向firstClass的值跟著變了,而firstStruct值還是沒變青柄。
接下來25和26行分別對firstClass和firstStruct賦新的值伐债,然后通過打印可以發(fā)現(xiàn)cpFirstClass的值改變了预侯,而cpFirstStruct的值沒有變。
通過上面這段代碼的實(shí)現(xiàn)結(jié)果峰锁,可以很好的證明萎馅,類class是引用類型,結(jié)構(gòu)體struct是值類型虹蒋,使用時(shí)是進(jìn)行的地址copy糜芳,而不是指向所引用的地址。
3魄衅、結(jié)構(gòu)體struct類型創(chuàng)建之后峭竣,都有一個(gè)自動(dòng)生成的成員逐一構(gòu)造器,用于初始化新結(jié)構(gòu)體實(shí)例中成員的屬性晃虫。而類class不會(huì)生成自動(dòng)生成成員逐一構(gòu)造器皆撩。如下代碼截圖:
通過上面的代碼可以看出,HelloStruct與HelloClass都沒有顯示的構(gòu)造器哲银,但是HelloStruct使用的時(shí)候扛吞,使用點(diǎn)“.”語法卻可以調(diào)用到一個(gè)成員逐一構(gòu)造器,HelloClass顯示的是init()或者報(bào)錯(cuò)荆责。
4滥比、class類有析構(gòu)過程,struct結(jié)構(gòu)體則沒有做院,使用析構(gòu)函數(shù)deinit分別在class類和struct結(jié)構(gòu)體中進(jìn)行調(diào)用盲泛,結(jié)果如下:
在struct結(jié)構(gòu)體中使用deinit函數(shù)會(huì)遭到錯(cuò)誤提示,所以struct結(jié)構(gòu)體中是不需要析構(gòu)過程键耕,因?yàn)閟truct結(jié)構(gòu)體是值類型寺滚。
5、class類中定義的變量時(shí)郁竟,變量如果不是可選類型玛迄?就必須給一個(gè)默認(rèn)值由境,struct結(jié)構(gòu)體則不需要棚亩。
第一段代碼中,class類中定義的變量都沒有賦初始值虏杰,也沒有明確是可選類型讥蟆,所以直接報(bào)錯(cuò),在第二段代碼中進(jìn)行設(shè)置纺阔,使用正常瘸彤。