2016-04-26 5 views
0

私はちょうど2日前に素早く習得し始めました。私のXcodeの遊び場で、私は次のコードを持っている:私はそれを実行しようとした場合tryブロックによるスウィフト2.2のエラー処理

//: Playground - noun: a place where people can play 

import UIKit 

enum VendingMachineError: ErrorType { 
    case InvalidSelection 
    case InsufficientFunds(coinsNeeded: Int) 
    case OutOfStock 
} 


func requestBeverage(code: Int, coins: Int) throws { 
    guard code > 0 else { 
     throw VendingMachineError.InvalidSelection 
    } 
    if coins < 2 { 
     throw VendingMachineError.InsufficientFunds(coinsNeeded: 3) 
    } 
    guard coins > 10 else { 
     throw VendingMachineError.OutOfStock 
    } 

    print("everything went ok") 
} 



try requestBeverage(-1, coins: 4) 
print("finished...") 

を、何も起こりません。私の論理では、何かをしようとすると失敗するので、プログラムは続行されるので、 "finished ..."という印字が期待されます。

質問はどうですか?できるだけ少ない単語でエラーが発生した場合にコードを継続するように指示するにはどうすればよいですか?事前に

おかげで

+0

は印刷「すべてがOKを行ってきました」でありますエド? – glace

+0

@glace no。 ...... – OWADVL

+0

あなたはそれがSwift 3だと確信していますか? Swift 3は、私が知る限り、まだベータ版ではありません(WWDC 2016の後になり、おそらく9月頃にリリースされるでしょう)。これはSwift 2.2(現在のバージョン)です。 – FreeNickname

答えて

1

すべてのエラーをキャッチすることができますdo/catchとY:また

do { 
    try requestBeverage(-1, coins: 4) 
} catch VendingMachineError.InvalidSelection { 
    print("Invalid selection") 
} catch VendingMachineError.OutOfStock { 
    print("Out of stock") 
} catch VendingMachineError.InsufficientFunds(let coinsNeeded) { 
    print("You need \(coinsNeeded) more coins") 
} catch { 
    // an unknown error occured 
} 

print("finished...") 

、あなただけのどちらエラーがスローされているかどうかを気にしますが、ない場合はtry?を使用します。

func requestSomeBeverage() { 
    guard (try? requestBeverage(-1, coins: 4)) != nil else { 
     print("An error has occured") 
     return 
    } 
} 

requestSomeBeverage() 
print("finished...") 

をあなたは絶対に確信している場合はエラーではないでしょう投げ、そしてあなたはそれが、try!を使用しない(ほとんどの場合では、ないではない)場合に例外を起こしたいこと:

try! requestBeverage(-1, coins: 4) 
print("finished...") 
1

あなたはスウィフト言語ガイド

編集にError Handlingを参照してください。エラーに

... 

do { 
    try requestBeverage(-1, coins: 4) 
} catch { 
    print(error) 
} 
print("finished...") 

をキャッチする必要があります:あなたは1行に式全体を書くことができます;-)

do { try requestBeverage(-1, coins: 4) } catch { print(error) } 
+0

okですが、ソリューションには6行のコードがあります。 1〜2行に何かありますか? – OWADVL

+0

実際には、さらに4行(!)行があります。どうしたの?もちろん、 'do'と' catch'節をそれぞれ1行に入れることはできますが、これは実際にはパフォーマンスを加速させるものではありません;-) – vadian

+1

@OWADVLあなたはいつでも 'try!'や 'try?'を使うことができますコードの行数を減らしたい... –

関連する問題