Classes and Structures

  • 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è)例子
    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"
    
    對(duì)于枚舉來說也是一樣:
    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)體中屬性順序,不能顛倒。
    let vga = Resolution(height: 480, width: 640)
    
    因此類中屬性,必須有初始值或者構(gòu)造器賦值。而結(jié)構(gòu)體則不用,因?yàn)榻Y(jié)構(gòu)體會(huì)自動(dòng)生成!
  • 使用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)于值拷貝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容