Swiftでのエラーハンドリングはdo-catchの中で行います。
Objective-C以上にエラーハンドリングが必要になってくるので、Objective-CからSwiftに来た場合は注意が必要です。
(実際にコードを書いてみると結構使う事になる)
* Errorプロトコルを継承することでエラーを定義できる
* Errorはdo - catchの中でtryキーワードと使う
* deferキーワードを使って関数の最後に必ず実行される処理を記述できる
```swift
`gutter:true;
// Errorプロトコルを継承してエラーを作成できる
enum PrinterError: Error {
case outOfPaper
case noToner
case onFire
}
// エラーをthrowする関数はthrowsキーワードで定義する
func send(job: Int, toPrinter printerName:String) throws -> String {
if printerName == "Never Has Toner" {
throw PrinterError.noToner
}
if printerName == "On Fire" {
throw PrinterError.onFire
}
return "Job sent"
}
do {
// let printerResponse = try send(job: 400, toPrinter: "Bi Sheng")
let printerResponse = try send(job: 400, toPrinter: "Never Has Toner")
print(printerResponse)
} catch {
print(error)
}
// エラー毎に処理を分けることも可能
do {
// let printerResponse = try send(job: 1440, toPrinter: "Musashi")
// let printerResponse = try send(job: 1440, toPrinter: "Never Has Toner")
let printerResponse = try send(job: 1440, toPrinter: "On Fire")
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)
}
```
try?キーワードでもハンドリングできます。
エラーの場合にnilになるので、詳細が不要な場合はこちらでOK
```swift
`gutter:true;
// try?でもエラーハンドリング可能
// この場合、Errorがthrowされるとnilになる
if let printerSuccess = try? send(job: 1884, toPrinter: "Fuji") {
print(printerSuccess)
}
if let printerFailure = try? send(job: 1885, toPrinter: "Never Has Toner") {
// ここは呼ばれない (printerfailureがnilになるので)
print(printerFailure)
}
```
### finaly的な処理(defer)
関数の最後に必ず処理を行いたい場合はdeferキーワードを使います。
これを使うと、関数の最後に処理が実行されます。
```swift
`gutter:true;
var fridgeIsOpen = false
let fridgeContent = ["milk", "eggs", "leftovers"]
func fridgeContains(_ food: String) -> Bool {
// deferキーワードを書くと必ず関数の最後に実行される
// 最後のクリーンアップ処理を記述するのに使える
defer {
fridgeIsOpen = false
}
fridgeIsOpen = true
let result = fridgeContent.contains(food)
return result
}
let retVal = fridgeContains("banana")
print("retVal = \(retVal)")
print(fridgeIsOpen) // falseになる
```
## 参考URL
* [Swiftツアー](https://docs.swift.org/swift-book/GuidedTour/GuidedTour.html)
* [GitHub](https://github.com/k28/swift_study.git)
0 件のコメント :
コメントを投稿