Swift--繼承, 初始化,錯誤處理--08

----繼承----

//繼承:class之間的“父子”關(guān)系的體現(xiàn)
//子類可以繼承父類的屬性和方法

class Viechle {
    var speed = 0
    var desc : String {
        return "時速是\(speed) km/h"
    }
    
    func makeNoise()  {
        
    }
}


class Bike : Viechle {
    var hasBasket = false 
}

let aBike = Bike()
aBike.speed = 30
aBike.desc
aBike.hasBasket
aBike.makeNoise()


//子類可以根據(jù)需要,修改繼承來的屬性和方法(多態(tài))
class CRH : Viechle {
    override func makeNoise() {
        print("嘟嘟嘟")
    }
}

let crh = CRH()
crh.makeNoise()

----初始化----

初始化:描述類/結(jié)構(gòu)體/枚舉實例化時,屬性如何給初始值的方法。形式init(){}。此方法稱之為構(gòu)造器。

//類的定義沒有給屬性默認的值,則需要在init中指定
class RoomTemp {
    var season : String
    var temp : Int
    
    init(season: String, temp :Int) {
        self.season = season
        self.temp = temp
    }
    
    
}

let temp1 = RoomTemp(season: "Spring", temp: 20)
temp1.season
temp1.temp


//結(jié)構(gòu)體定義不需要指定屬性默認的值,因為默認提供一個包含所有屬性初始化的構(gòu)造器

struct RoomTemp1 {
    var season : String
    var temp : Int
}

let temp2 = RoomTemp1(season: "summer", temp: 30)


//便利構(gòu)造器, 可以通過對主構(gòu)造器的包裝,實現(xiàn)便利的初始化
class Food {
    var name : String
    init(name : String) {
        self.name = name
    }
    
    convenience init() {
        self.init(name: "飯食")
    }
    
}


let food = Food()


//可失敗構(gòu)造器:針對有可能的初始化失敗,返回nil。比如:初始化一張圖片,如果圖片名不存在,則初始化失敗。
struct Animal {
    let name : String
    
    init?(name:String) {
        if name.isEmpty {
            print("沒有給動物命名")
            return nil
        }
        self.name = name
    }
}

let cat = Animal(name: "")

----錯誤處理----

錯誤處理:反映運行出錯的細節(jié),并恢復程序的過程。
可選類型僅處理值缺失,錯誤處理可以針對不同的出錯原因有不同的應(yīng)對

//一個函數(shù)可以加上throws關(guān)鍵字,表示可以處理錯誤,這個函數(shù)的調(diào)用者可以捕獲(catch)這個錯誤并進行應(yīng)對
func aFoo() throws {
    print("小波的斗魚直播間")
}


//當你調(diào)用可以拋出錯誤的函數(shù),需在前面加上try關(guān)鍵字
try aFoo()


//處理更細分的錯誤信息,錯誤類型須遵從ErrorType協(xié)議
enum LearningObs : Error {
    case noMethod,noReading,noTool(tool : String)
}

func iosDev (method:Bool,style:Bool,hasTool:Bool) throws {
    guard method else {
        throw LearningObs.noMethod
    }
    
    guard style else {
        throw LearningObs.noReading
    }
    
    guard hasTool else {
        throw LearningObs.noTool(tool: "缺少 工具")
    }
}

var budget = 7000
func buy(tool:String) {
    if budget >= 6000 {
        budget -= 6000
        print("您已經(jīng)購買",tool,"花費6k,余額為:",budget)
    } else {
        print("資金不足")
    }
    
}

do {
    try iosDev(method: false, style: false, hasTool: false)
    print("恭喜,你已經(jīng)開始學習ios開發(fā)")
} catch LearningObs.noMethod {
    print("沒有好的學習方法")
} catch LearningObs.noReading {
    print("不想看書")
} catch LearningObs.noTool {
    buy(tool: "mac")
}



//有時候僅關(guān)心結(jié)果有無,可使用try?或try!來忽略錯誤細節(jié)
if let result = try? iosDev(method: true, style: true, hasTool: false) {
    print("恭喜進入學習")
} else {
     print("學習條件不足")
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 官方文檔 初始化 Initialization是為準備使用類,結(jié)構(gòu)體或者枚舉實例的一個過程。這個過程涉及了在實例里...
    hrscy閱讀 1,201評論 0 1
  • 123.繼承 一個類可以從另外一個類繼承方法,屬性和其他特征。當一個類繼承另外一個類時, 繼承類叫子類, 被繼承的...
    無灃閱讀 1,491評論 2 4
  • 初始化 (Initialization) 自從蘋果2014年發(fā)布Swift,到現(xiàn)在已經(jīng)兩年多了,而Swift也來到...
    Lebron_James閱讀 1,269評論 0 0
  • 初始化(Initialization) 初始化是類、結(jié)構(gòu)體、枚舉類型的準備過程。這個過程涉及到所有存儲屬性的初始化...
    泗哥閱讀 5,708評論 0 3
  • 20- 枚舉,枚舉原始值,枚舉相關(guān)值,switch提取枚舉關(guān)聯(lián)值 Swift枚舉: Swift中的枚舉比OC中的枚...
    iOS_恒仔閱讀 2,427評論 1 6

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