2016年10月2日日曜日

Swift3.0でdo-catch構文によるエラーハンドリング

Javaなどにあるtry-catch構文のSwift版、と言ったところでしょうか。

let device = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)
let input:AVCaptureDeviceInput?
do {
    input = try AVCaptureDeviceInput.init(device: device)
} catch  {
    input = nil
}
実行する分の手前にtryキーワードを置くところがポイント。 また、catchの部分でパターンマッチも可能で、

var vendingMachine = VendingMachine()
vendingMachine.coinsDeposited = 8
do {
    try buyFavoriteSnack(person: "Alice", vendingMachine: vendingMachine)
} catch VendingMachineError.invalidSelection {
    print("Invalid Selection.")
} catch VendingMachineError.outOfStock {
    print("Out of Stock.")
} catch VendingMachineError.insufficientFunds(let coinsNeeded) {
    print("Insufficient funds. Please insert an additional \(coinsNeeded) coins.")
}
// Prints "Insufficient funds. Please insert an additional 2 coins."
なんて書き方もできる。 ちなみにエラーを投げる関数を定義する場合には、戻り値の手前にthrowsキーワードをつける必要あり。

func canThrowErrors() throws -> String
参考: The Swift Programming Language (Swift 3): Error Handling