Swift學(xué)習(xí)筆記三-對(duì)象和類

Swift有很多高級(jí)特性,個(gè)人感覺Swift在語(yǔ)法跟數(shù)據(jù)結(jié)構(gòu)上比Java要高級(jí)好多.

聲明類
import Foundation
//使用class和類名創(chuàng)建一個(gè)類.類中屬性的聲明和常量,變量聲明一樣,唯一的區(qū)別就是它們的上下文是類.同樣,方法同函數(shù)聲明也一樣.
class Shape {
    var numberOfSides = 0
    let maxNumber = 0
    func simpleDescripe() -> String {
        return "A shape with \(numberOfSides) sides"
    }
    func calMaxNumber(number:Int) -> String {
        return "The max number is \(number)"
    }
}
實(shí)例化類并訪問屬性調(diào)用方法
//要?jiǎng)?chuàng)建一個(gè)類的實(shí)例,在類名后面加上括號(hào),用點(diǎn)語(yǔ)法訪問屬性和方法
var shape = Shape()
shape.numberOfSides = 7
var shapeDescription = shape.simpleDescripe()
創(chuàng)建構(gòu)造器(構(gòu)造方法)
//上面的類Shape少了一些重要的東西:一個(gè)構(gòu)造函數(shù)來(lái)初始化類實(shí)例,用init來(lái)創(chuàng)建一個(gè)構(gòu)造器
class NamedShape {
    var numberOfSides: Int = 0
    var name: String
    init(name: String) {
        self.name = name
    }
    func simpleDescription() -> String {
        return "A shape with \(numberOfSides) sides"
    }
}
//注意self是用來(lái)區(qū)別實(shí)例變量的.當(dāng)創(chuàng)建實(shí)例的時(shí)候,像給函數(shù)傳入?yún)?shù)一樣一樣給類的構(gòu)造函數(shù)傳入函數(shù),每個(gè)屬性都需要被賦值,不然會(huì)報(bào)錯(cuò)--無(wú)論是通過(guò)聲明(像numberOfSides)還是通過(guò)構(gòu)造函數(shù)(就像name)
//如果需要在刪除對(duì)象之前進(jìn)行清理操作,使用deinit創(chuàng)建一個(gè)析構(gòu)函數(shù)
繼承父類重寫方法
//子類的定義方法是在他們的類名后面加上父類的名字,用冒號(hào)分隔.創(chuàng)建類的時(shí)候并不需要一個(gè)標(biāo)準(zhǔn)的根類,所以可以忽略父類.
//子類如果要重寫父類的方法,需要用override標(biāo)記.如果沒用標(biāo)記就重寫父類方法編譯器會(huì)報(bào)錯(cuò).編譯器同樣會(huì)檢測(cè)override標(biāo)記的方法是否確實(shí)在父類中.
class Sequare: NamedShape {
    var sideLength: Double
    init (sideLength: Double, name:String) {
        self.sideLength = sideLength
        super.init(name: name)
        numberOfSides = 4
    }
    
    func area() -> Double {
        return sideLength * sideLength
    }
    
    override func simpleDescription() -> String {
        return "A square with sides of length is \(sideLength)"
    }
}
let sequare = Sequare(sideLength: 5.0, name: "xiaoming")
sequare.area()
sequare.simpleDescription()

//練習(xí): 創(chuàng)建NamedShape的另一個(gè)子類Circle,構(gòu)造器接收兩個(gè)參數(shù),一個(gè)是半徑一個(gè)是名稱,在子類Circle中實(shí)現(xiàn)area()和simpleDescription()方法。
class Circle:NamedShape {
    var radius:Double
    init(radius: Double, name: String) {
        self.radius = radius
        super.init(name: name)
    }
    
    func area() -> Double {
        return radius * radius * 3.14
    }
    
    override func simpleDescription() -> String {
        return "A circle with radius of length is \(radius)"
    }
}
屬性的setter和getter
//除了存儲(chǔ)簡(jiǎn)單的屬性之外,屬性還可以有g(shù)etter方法和setter方法
//在swift中使用get/set 主要是用來(lái)間接獲取/改變其他屬性的值。在swift中這類屬性被稱之為“計(jì)算屬性” ,不要拿其他面向?qū)ο笳Z(yǔ)言跟Swift作對(duì)比(尤其是Java,OC,Java中的setter跟getter方法就是操作本屬性)
class EquilateralTriangle: NamedShape {
    var sideLength: Double = 0.0
    
    init(sideLength: Double, name: String) {
        self.sideLength = sideLength
        super.init(name: name)
        numberOfSides = 3
    }
    
    var perimeter: Double {
        get {
            return 3.0 * sideLength
        }
        set {
            sideLength = newValue / 3.0
        }
//        set(value) {
//            sideLength = value / 3.0
//        }
    }
}
var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
print(triangle.perimeter)
triangle.perimeter = 9.9
print(triangle.sideLength)
//在perimeter的setter中,新值的名字是newValue.可以在set之后顯式設(shè)置一個(gè)名字.
//注意:EquilateralTriangle類的構(gòu)造器執(zhí)行了三步:
//1.設(shè)置子類聲明的屬性值
//2.調(diào)用子類構(gòu)造器
//3.改變父類定義的屬性值.其他的工作比如調(diào)用方法,getters和setters也可以在這個(gè)階段完成.
屬性監(jiān)視willSet跟didSet
//如果不需要計(jì)算屬性,但是仍然需要在設(shè)置一個(gè)新值之前或者之后運(yùn)行代碼,使用willSet或者didSet.willSet跟didSet用來(lái)監(jiān)視除初始化之外的屬性值的變化.當(dāng)這個(gè)值變化之前做點(diǎn)什么別的事,變化之后做點(diǎn)什么別的事.
//比如,下面的了確保三角形的變成總是和正方形的變成相同
class TriangleAndSquare {
    
    var  triangle: EquilateralTriangle {
        willSet {
            sequare.sideLength = newValue.sideLength
        }
//        willSet(value) {
//            print("willSet")
//            sequare.sideLength = value.sideLength
//        }
    }
    
    var sequare: Sequare {
        willSet {
            triangle.sideLength = newValue.sideLength
        }
    }
    
    init(size: Double, name: String) {
        sequare = Sequare(sideLength: size, name: name)
        triangle = EquilateralTriangle(sideLength: size, name: name)
    }
}
var triangleAndSquare = TriangleAndSquare(size: 10, name: "Another test sequare")
print(triangleAndSquare.sequare.sideLength)
print(triangleAndSquare.triangle.sideLength)
triangleAndSquare.sequare = Sequare(sideLength: 50, name: "larger sequare")//只有這句才能調(diào)用willSet,初始化不調(diào)用
print(triangleAndSquare.triangle.sideLength)
處理可選值
//處理變量的可選值時(shí),可以在操作(比如屬性,方法,子腳本)之前加?.如果?之前的值是nil,則?后面的內(nèi)容會(huì)被忽略,并且整個(gè)表達(dá)式返回nil.否則?之后的內(nèi)容都會(huì)被執(zhí)行.這兩種情況下整個(gè)表達(dá)式也是一個(gè)可選值
let optionalSquare: Sequare? = Sequare(sideLength: 20, name: "optional")
let sideLength = optionalSquare?.sideLength
print(sideLength!)

本文原地址:Swift學(xué)習(xí)筆記三-對(duì)象和類

最后編輯于
?著作權(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)容