swift 中類和結(jié)構(gòu)體的區(qū)別
結(jié)構(gòu)和類
結(jié)構(gòu)和類是通用的悍手,靈活的結(jié)構(gòu),它們成為程序代碼的構(gòu)建塊悠轩。您可以定義屬性和方法间狂,以使用與定義常量,變量和函數(shù)相同的語(yǔ)法向結(jié)構(gòu)和類添加功能火架。
與其他編程語(yǔ)言不同鉴象,Swift不需要您為自定義結(jié)構(gòu)和類創(chuàng)建單獨(dú)的接口和實(shí)現(xiàn)文件。在Swift中何鸡,您可以在一個(gè)文件中定義一個(gè)結(jié)構(gòu)或類纺弊,并且該類或結(jié)構(gòu)的外部接口會(huì)自動(dòng)提供給其他代碼使用。
筆記
傳統(tǒng)上將類的實(shí)例稱為對(duì)象骡男。然而淆游,夫特結(jié)構(gòu)和類在功能上更接近比在其他語(yǔ)言,等等本章的描述適用于實(shí)例功能任一類或結(jié)構(gòu)類型隔盛。因此犹菱,使用了更通用的術(shù)語(yǔ)實(shí)例。
比較結(jié)構(gòu)和類
Swift中的結(jié)構(gòu)和類有很多共同點(diǎn)吮炕。兩者都可以:
定義屬性以存儲(chǔ)值
定義提供功能的方法
定義下標(biāo)以使用下標(biāo)語(yǔ)法提供對(duì)它們的值的訪問(wèn)
定義初始值設(shè)定項(xiàng)以設(shè)置其初始狀態(tài)
擴(kuò)展以擴(kuò)展其功能腊脱,使其超出默認(rèn)實(shí)現(xiàn)
符合協(xié)議以提供某種標(biāo)準(zhǔn)功能
類具有結(jié)構(gòu)沒(méi)有的其他功能:
繼承使一個(gè)類可以繼承另一個(gè)類的特征。
通過(guò)類型轉(zhuǎn)換龙亲,您可以在運(yùn)行時(shí)檢查和解釋類實(shí)例的類型陕凹。
反初始化程序使類的實(shí)例釋放其已分配的任何資源。
引用計(jì)數(shù)允許對(duì)一個(gè)類實(shí)例進(jìn)行多個(gè)引用鳄炉。
Swift中的所有基本類型(整數(shù)杜耙,浮點(diǎn)數(shù),布爾值迎膜,字符串泥技,數(shù)組和字典)都是值類型(來(lái)自官方文檔)
考慮以下示例浆兰,該示例使用Resolution
上一個(gè)示例的結(jié)構(gòu):
1. let hd = Resolution(width: 1920, height: 1080)
2. var cinema = hd
本示例聲明一個(gè)常量hd
磕仅,并將其設(shè)置為使用Resolution
全高清視頻的寬度和高度(1920像素寬x 1080像素高)初始化的實(shí)例珊豹。
然后,它聲明一個(gè)名為的變量cinema
榕订,并將其設(shè)置為的當(dāng)前值hd
店茶。因?yàn)?code>Resolution是結(jié)構(gòu),所以將創(chuàng)建現(xiàn)有實(shí)例的副本劫恒,并將此新副本分配給cinema
贩幻。盡管現(xiàn)在hd
和cinema
現(xiàn)在具有相同的寬度和高度,但它們是幕后的兩個(gè)完全不同的實(shí)例两嘴。
接下來(lái)丛楚,將的width
屬性cinema
修改為用于數(shù)字電影放映的稍寬的2K標(biāo)準(zhǔn)的寬度(寬2048像素,高1080像素):
1. cinema.width = 2048
檢查的width
屬性cinema
表明它確實(shí)已更改為2048
:
1. print("cinema is now \(cinema.width) pixels wide")
2. // Prints "cinema is now 2048 pixels wide"
但是憔辫,width
原始hd
實(shí)例的屬性仍然具有舊值1920
:
1. print("hd is still \(hd.width) pixels wide")
2. // Prints "hd is still 1920 pixels wide"
當(dāng)cinema
提供了的當(dāng)前值時(shí)hd
趣些,存儲(chǔ)在中的值將hd
復(fù)制到新cinema
實(shí)例中。最終結(jié)果是兩個(gè)完全獨(dú)立的實(shí)例贰您,其中包含相同的數(shù)值坏平。然而,因?yàn)樗鼈兪仟?dú)立的情況下锦亦,設(shè)定的寬度cinema
舶替,以2048
不影響存儲(chǔ)在所述寬度hd
,如示于下圖中:
相同的行為適用于枚舉:
1. enum CompassPoint {
2. case north, south, east, west
3. mutating func turnNorth() {
4. self = .north
5. }
6. }
7. var currentDirection = CompassPoint.west
8. let rememberedDirection = currentDirection
9. currentDirection.turnNorth()
11. print("The current direction is \(currentDirection)")
12. print("The remembered direction is \(rememberedDirection)")
13. // Prints "The current direction is north"
14. // Prints "The remembered direction is west"
當(dāng)rememberedDirection
被賦予的價(jià)值currentDirection
杠园,它實(shí)際上是設(shè)置為該值的副本顾瞪。更改currentDirection
其后的值不會(huì)影響存儲(chǔ)在中的原始值的副本rememberedDirection
。
類:
結(jié)構(gòu)體和類初始化器
一旦自定義了結(jié)構(gòu)體的初始化器抛蚁,那么系統(tǒng)就不再為這個(gè)結(jié)構(gòu)體生成其他的初始化器玲昧。