2017-08-04 4 views
0

私はそれを必要とするどこでも絶えず書いているのではなく、すぐに3 do-catchを関数の中に入れたいと思っています。この関数の中では、ブール値とオプションのエラーでtupleを返したいと思います。Swift条件付きバインディングにオプションの型が必要なキャッチからタプルを返す方法は?

私はしかし、私はというエラーを取得関数からタプルを返すと、私のXCTest

で結果を処理しようとしています

初期化子の条件付き結合のために 'がない、オプションのタイプを持っている必要があります(Bool、Error?) '(別名(Bool、Optional))

私の機能は以下の通りです。

public static func isValidPurchase(train: Train, player: Player) -> (Bool, Error?) { 
    do { 
     let result = try train.canBePurchased(by: player) 
     return (result, nil) 
    } catch let error { 
     return (false, error) 
    } 
} 

canBePurchasedコードは少し長いですが、それはこのように書きます:私が試した

if let result = TrainAPI.isValidPurchase(train: firstTrain, player: firstPlayer) as! (Bool, Error?) { 

} 

func canBePurchased(by player: Player) throws -> Bool { 

     if (!self.isUnlocked) { 
      throw ErrorCode.trainIsNotUnlocked(train: self) 
     } 

    // other if-statements and throws go here 
} 

そして、私のXCTestで、私はそのように呼んで

強制キャスト:

if let result: (Bool, Error?) ...

しかし、これはコンパイラエラーを警告に降格するだけです。

コンパイラは上記のエラーを表示します。

私はInitializer for conditional binding must have Optional typeの点で何が間違っていますか?どのように避けますか?

ありがとう

答えて

1

isValidPurchase(train:player)からの戻り型は、(それが第2部材は、オプションであることを起こるタプルである)オプションされていない、(Bool, Error?)あります。したがって、isValidPurchase(train:player)への呼び出しからの戻り値をキャプチャするときには、オプションのバインディングを使用する必要はありません。あなたは、単に戻り値を代入し、そこからのコンテンツ(可能なエラーなど)の調査:

// e.g. using explicitly separate tuple members 
let (result, error) = TrainAPI 
    .isValidPurchase(train: firstTrain, player: firstPlayer) 

if let error = error { /* you have an error */ } 
else { /* no error, proceed with 'result' */ } 

または、switch文を使用してリターンを勉強:

// result is a tuple of type (Bool, Error?) 
let result = TrainAPI 
     .isValidPurchase(train: firstTrain, player: firstPlayer) 

switch result { 
    case (_, let error?): print("An error occured!") 
    case (let result, _): print("Result = \(result)") 
} 
+0

。私は変更を行い、助けてくれてありがとう – zardon

1

力注入の代わりにオプションの鋳造を使用してください。 forceキャスト結果を使用すると、if let文なしで使用しても、オプションではない値になります。

if let result = TrainAPI.isValidPurchase(train: firstTrain, player: firstPlayer) as? (Bool, Error?) { 

} 
+0

大丈夫ああ、多くのおかげ – zardon

+0

これが実行されます'(Bool、Error?)'から '(Bool、Error?)'への変換を試みました。つまり、型からそれ自身への変換が試みられました。これは常に成功します(プロジェクトでこれを試してみると、このケースは常に成功すると警告する必要があります)。だから、これは実際にはプロパティ( 'result')にインスタンスを代入する回り道です。オプションの' .some(...) 'に最初に詰め込み、具体的な値に直ちに展開します。 – dfri

関連する問題