iOS Swift基礎(chǔ)學(xué)習(xí)筆記(六)錯(cuò)誤處理(Error Handling) 和 泛型(Generics)

錯(cuò)誤處理

使用任何采用Error協(xié)議的類型表示錯(cuò)誤。

enum PrinterError: Error {
    case outOfPaper
    case noToner
    case onFire
}

使用throw來拋出一個(gè)錯(cuò)誤,使用throws來標(biāo)記函數(shù)可以拋出錯(cuò)誤份蝴。如果函數(shù)中拋出錯(cuò)誤犁功,函數(shù)將立即返回,調(diào)用該函數(shù)的代碼來處理拋出的錯(cuò)誤婚夫。

func send(job: Int, toPrinter printerName: String) throws -> String {
    if printerName == "Never Has Toner" {
        throw PrinterError.noToner
    }
    return "Job sent"
}

有幾種方法來處理錯(cuò)誤浸卦。 一種方法是使用do-catch。 在do模塊里面案糙,你可以通過在它前面寫try來標(biāo)記拋出錯(cuò)誤的代碼限嫌。 在catch模塊內(nèi),會(huì)自動(dòng)給出錯(cuò)誤名稱时捌,除非你給它一個(gè)不同的名稱怒医。

練習(xí):printerName改成“Never Has Toner”,那么send(job:toPrinter:)將拋出錯(cuò)誤奢讨。

do {
    let printerResponse = try send (job: 1040, toPrinter: "Never Has Toner")
    print(printerResponse)
    
} catch {
    print(error)
}

可以提供處理特定錯(cuò)誤的多個(gè)catch塊稚叹。 你在catch后寫一個(gè)模式,就像在switch后的case一樣禽笑。

do {
    let printerResponse = try send(job: 1440, toPrinter: "Gutenberg")
    print(printerResponse)
} catch PrinterError.onFire {
    print("I'll just put this over here, with the rest of the fire.")
} catch let printerError as PrinterError {
    print("Printer error: \(printerError).")
} catch {
    print(error)
}

練習(xí):do塊中添加代碼拋出一個(gè)錯(cuò)誤入录。 你需要拋出什么樣的錯(cuò)誤,使錯(cuò)誤讓第一個(gè)catch塊處理佳镜? 讓第二和第三catch塊處理錯(cuò)誤又該怎么做呢僚稿?

do {
    let printerResponse = try send(job: 1440, toPrinter: "onFire")
    if printerResponse == "Job sent" {
        throw PrinterError.onFire
    }
    print(printerResponse)
} catch PrinterError.onFire {
    print("I'll just put this over here, with the rest of the fire.")
} catch let printerError as PrinterError {
    print("Printer error: \(printerError).")
} catch {
    print(error)
}

另一種處理錯(cuò)誤的方法是使用try?將結(jié)果轉(zhuǎn)換為可選。 如果函數(shù)拋出錯(cuò)誤蟀伸,則丟棄特定錯(cuò)誤蚀同,結(jié)果為nil。 否則啊掏,結(jié)果是一個(gè)可選的蠢络,包含函數(shù)返回的值。

let printerSuccess = try? send(job: 1884, toPrinter: "Mergenthaler")
let printerFailure = try? send(job: 1885, toPrinter: "Never Has Toner")

使用defer來寫一個(gè)代碼塊迟蜜,該代碼塊在函數(shù)中的所有其他代碼之后刹孔,僅在函數(shù)返回之前執(zhí)行該代碼塊。 無論函數(shù)是否拋出錯(cuò)誤娜睛,都會(huì)執(zhí)行該代碼塊髓霞。 您可以使用defer將設(shè)置(setup)和清除(cleanup)代碼寫在一起,即使它們需要在不同的時(shí)間執(zhí)行畦戒。

var fridgeIsOpen = false
let fridgeContent = ["milk", "eggs", "leftovers"]

func fridgeContains(_ food: String) -> Bool {
    fridgeIsOpen = true
    defer {
        fridgeIsOpen = false
    }
    
    let result = fridgeContent.contains(food)
    return result
}
fridgeContains("banana")
print(fridgeIsOpen)

泛型

在尖括號(hào)中寫入一個(gè)名稱來創(chuàng)建泛型函數(shù)或者泛型類型方库。

func makeArray<Item>(repeating item: Item, numberOfTimes: Int) -> [Item] {
    var result = [Item]()
    for _ in 0..<numberOfTimes  {
        result.append(item)
    }
    return result
}
makeArray(repeating: "knock", numberOfTimes: 4)

你可以為函數(shù)、方法障斋、類纵潦、枚舉以及結(jié)構(gòu)體創(chuàng)建泛型徐鹤。

//重新實(shí)現(xiàn) Swift 標(biāo)準(zhǔn)庫(kù)中的可選類型(optional type)
enum OptionalValue<Wrapped> {
    case none
    case some(Wrapped)
}
var possibleInteger: OptionalValue<Int> = .none
print(possibleInteger)
possibleInteger = .some(100)
print(possibleInteger)

var possibleString: OptionalValue<String> = .none
possibleString = .some("ha")

在類型名稱后使用where來指明一系列的要求。比如邀层,要求類型遵守某個(gè)協(xié)議返敬,要求兩種類型相同,或者要求一個(gè)類有一個(gè)指定的超類被济。

func anyCommonElements<T: Sequence, U: Sequence>(_ lhs: T, _ rhs: U) -> Bool
    where T.Iterator.Element: Equatable, T.Iterator.Element == U.Iterator.Element {
        for lhsItem in lhs {
            for rhsItem in rhs {
                if lhsItem == rhsItem {
                    return true
                }
            }
        }
    
    return false
}
anyCommonElements([1, 2, 3], [5])
anyCommonElements([1, 2, 3], [3])

練習(xí):修改anyCommonElements函數(shù)救赐,讓它返回傳入的兩個(gè)隊(duì)列中相同元素組成的數(shù)組涧团。

func anyCommonElements<T: Sequence, U: Sequence>(_ lhs: T, _ rhs: U) -> Array<Any>
    where T.Iterator.Element: Equatable, T.Iterator.Element == U.Iterator.Element {
//        var commonArray = Array<Any>()
        var commonArray = [Any]()
        
        for lhsItem in lhs {
            for rhsItem in rhs {
                if lhsItem == rhsItem {
                    commonArray.append(lhsItem)
                }
            }
        }
        
        return commonArray
}
anyCommonElements([1, 3, 6, 8], [3, 5, 1])

在簡(jiǎn)單的情況下只磷,你可以忽略where,只需要在冒號(hào)后面指明協(xié)議或者類泌绣。 <T: Equatable><T where T: Equatable>是等價(jià)的钮追。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市阿迈,隨后出現(xiàn)的幾起案子元媚,更是在濱河造成了極大的恐慌,老刑警劉巖苗沧,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刊棕,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡待逞,警方通過查閱死者的電腦和手機(jī)甥角,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來识樱,“玉大人嗤无,你說我怎么就攤上這事×梗” “怎么了当犯?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)割疾。 經(jīng)常有香客問我嚎卫,道長(zhǎng),這世上最難降的妖魔是什么宏榕? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任拓诸,我火速辦了婚禮,結(jié)果婚禮上担扑,老公的妹妹穿的比我還像新娘恰响。我一直安慰自己,他們只是感情好涌献,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布胚宦。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪枢劝。 梳的紋絲不亂的頭發(fā)上井联,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音您旁,去河邊找鬼烙常。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鹤盒,可吹牛的內(nèi)容都是我干的蚕脏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼侦锯,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼驼鞭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起尺碰,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤挣棕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后亲桥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洛心,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年题篷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了词身。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡悼凑,死狀恐怖偿枕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情户辫,我是刑警寧澤渐夸,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站渔欢,受9級(jí)特大地震影響墓塌,放射性物質(zhì)發(fā)生泄漏赞哗。R本人自食惡果不足惜验游,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望图张。 院中可真熱鬧垫挨,春花似錦韩肝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涡相。三九已至,卻和暖如春剩蟀,著一層夾襖步出監(jiān)牢的瞬間催蝗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工育特, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留丙号,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓缰冤,卻偏偏與公主長(zhǎng)得像犬缨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子锋谐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容