- swift中的類區(qū)別于其他語言,不區(qū)分接口和實(shí)現(xiàn),也就是說不同于OC中
.h和.m兩個(gè)文件,而是集合在一個(gè)。更貼近功能而非object - 類和結(jié)構(gòu)體均可以:使用屬性儲(chǔ)存值;定義方法實(shí)現(xiàn)功能;使用點(diǎn)語法訪問;使用初始化器初始化;通過拓展增加默認(rèn)實(shí)現(xiàn)功能;遵守實(shí)現(xiàn)協(xié)議;
- 類所獨(dú)有的功能:繼承;運(yùn)行時(shí)使用類型轉(zhuǎn)換檢查解釋類型;析構(gòu)器可以取消實(shí)例分配所有資源;
- 類允許使用引用計(jì)數(shù)對(duì)一個(gè)類多次引用,即引用類型。結(jié)構(gòu)體以復(fù)制的形式在代碼中傳遞,而不是引用計(jì)數(shù),即值類型。
- 類通常用于較為復(fù)雜的情況,而結(jié)構(gòu)體和枚舉通常用于數(shù)據(jù)結(jié)構(gòu)。結(jié)構(gòu)體用于簡(jiǎn)單少量的數(shù)據(jù),比如封裝幾何圖形的邊長,3D圖形坐標(biāo)等,大多數(shù)情況下還是使用class
- 結(jié)構(gòu)體和類的初始化
struct Resolution { var width = 0 var height = 0 } class VideoMode { var resolution = Resolution() var interlaced = false var frameRate = 0.0 var name: String? } - 不同于OC,可以直接設(shè)置某結(jié)構(gòu)體內(nèi)的其中一個(gè)具體值,而不需重新設(shè)置整個(gè)屬性結(jié)構(gòu)體
someVideoMode.resolution.width = 100 - 關(guān)于結(jié)構(gòu)體是值類型的一個(gè)例子
對(duì)于枚舉來說也是一樣:let hd = Resolution(width: 1920, height: 1080) //值拷貝,修改cinema不會(huì)影響hd var cinema = hd cinema.width = 2048 print("cinema is now \(cinema.width) pixels wide") // Prints "cinema is now 2048 pixels wide" print("hd is still \(hd.width) pixels wide") // Prints "hd is still 1920 pixels wide"enum CompassPoint { case north, south, east, west mutating func turnNorth() { self = .north } } var currentDirection = CompassPoint.west let rememberedDirection = currentDirection currentDirection.turnNorth() print("The current direction is \(currentDirection)") print("The remembered direction is \(rememberedDirection)") // Prints "The current direction is north" // Prints "The remembered direction is west" - 結(jié)構(gòu)體自動(dòng)擁有多個(gè)成員逐一初始化器,而類沒有。參數(shù)順序必須按照結(jié)構(gòu)體中屬性順序,不能顛倒。
因此類中屬性,必須有初始值或者構(gòu)造器賦值。而結(jié)構(gòu)體則不用,因?yàn)榻Y(jié)構(gòu)體會(huì)自動(dòng)生成!let vga = Resolution(height: 480, width: 640) - 使用let初始化類的實(shí)例,當(dāng)實(shí)例的屬性類型聲明為var時(shí),可以對(duì)其進(jìn)行改變。這是因?yàn)橛胠et聲明的是指向該實(shí)例的指針,我們并沒有修改該指針,而是修改了該指針指向地址中的內(nèi)容,如果實(shí)例屬性聲明為var則說明該地址中的內(nèi)容可以修改。但是,作為引用類型的類的實(shí)例可以,而作為值類型的結(jié)構(gòu)體則不行(使用let初始化機(jī)構(gòu)體引用則不能修改其屬性)
- 使用等價(jià)于(===)判斷兩個(gè)類類型(ClassType)的變量或者常量是否引用同一實(shí)例,即是否指向同一地址。
- 等價(jià)于(Identical to):
===;等于(Equal to):==。 - swift中的引用類型并不直接指向地址,也不需要使用*來說明是引用,而是和其他常量或變量的定義方式相同
重要!
swift中的Int,F(xiàn)loat,String,Array,Dictionary,Structure,Enumeration都是值類型。值類型在賦值和作為參數(shù)傳遞給函數(shù)時(shí)都是進(jìn)行的拷貝操作,而新拷貝的實(shí)例和原實(shí)例是兩個(gè)內(nèi)容相同但是地址不同的值,改變其中一個(gè)不會(huì)影響到另一個(gè)的值。
跟OC中的值類型是一樣的。
arrays、dictionaries以及strings作為集合類型,在拷貝的時(shí)候使用了優(yōu)化減少拷貝開銷。在拷貝過程中,集合中的元素并沒有立即拷貝,而是源集合和拷貝集合共用同一地址。而在拷貝后的集合中元素修改時(shí),立即拷貝集合中的元素,以此來進(jìn)行優(yōu)化且對(duì)外相當(dāng)于值拷貝。