2017-04-19 6 views
-1

配列の数が0より大きいかどうかをテストしたい場合は、現在のビューを閉じます。手動でdo ... catchステートメントをキャッチするcatch

は、今のところ私はこのようにそれをやっている:カウントが0より大きくない場合、私はちょうど手動catchdo..catchを送信できる場合

do { 
    let pets = try self.managedObjectContext.fetch(request) 
    guard pets.count > 0 else { 
     self.dismiss(animated: true, completion: nil) 
    } 
    dateCreated = Date(timeIntervalSince1970: Double(pets[0].dateCreated)) 
} catch { 
    self.dismiss(animated: true, completion: nil) 
} 

は、私は思ったんだけど、私は「ドンそのように2回書かれたself.dismiss(animated: true, completion: nil)が必要です。これが可能なら誰でも知っていますか?

答えて

4

明らかにあなたはのであなたの代わりにdo-catchtry?を使用することができますerror気にしないでください:

guard 
    let pets = try? self.managedObjectContext.fetch(request), 
    !pets.isEmpty 
else { 
    self.dismiss(animated: true, completion: nil) 
    return 
} 

dateCreated = Date(timeIntervalSince1970: Double(pets[0].dateCreated)) 

別のオプションは、例えば、機能/クロージャの中に重複したコードを移動することですあなたはdoブロックに固執している場合

let onError:() -> Void = { 
    self.dismiss(animated: true, completion: nil) 
} 

do { 
    let pets = try self.managedObjectContext.fetch(request) 
    guard pets.count > 0 else { 
     onError() 
     return 
    } 
    dateCreated = Date(timeIntervalSince1970: Double(pets[0].dateCreated)) 
} catch { 
    onError() 
} 
+0

私はあなたの答えが私のものよりも好きですが、彼は投げがオプションであることを見なければならないと考えました。 @DanielT。 –

+0

どのようなシナリオでも偽のエラーを投げるのは良い選択だとは思わない。たとえば、 'let onError:() - > Void = {self.dismiss(...)}'を定義して両方のブランチから 'onError'を呼び出すことで、重複を削除できます()。それは間違いを犯すよりも優れています。 – Sulthan

+0

私は同意しますが、質問者または将来の読者がエラーが偽造されない場所を扱っているという大きな文脈があるかもしれません。私が言ったように、あなたの答えは尋ねられた正確な質問の方が良いです。 –

1

、あなたはこれを行うことができます:あなたはdeferを使用してみたいよう

struct MyError: Error { } 

do { 
    let pets = try self.managedObjectContext.fetch(request) 
    guard pets.count > 0 else { 
     throw MyError() 
    } 
    dateCreated = Date(timeIntervalSince1970: Double(pets[0].dateCreated)) 
} catch { 
    self.dismiss(animated: true, completion: nil) 
} 
0

ですね。

guard状態が返されません。それは問題です。

deferを使用すると、コードの行は、メソッドの終了時に呼び出される保証します

defer { 
    self.dismiss(animated:true, completion:nil) 
} 

do { 
    let pets = try self.managedObjectContext.fetch(request) 
    guard pets.count > 0 else { 
     return 
    } 
    dateCreated = Date(timeIntervalSince1970: Double(pets[0].dateCreated)) 
} catch { 
    // TODO - do any error work required if no pets. Possibly nothing. 
} 

のようなものを試してみてください。

+0

しかし、コードが正常に実行された場合、 'dismiss'の呼び出しは望ましくありません。 – rmaddy

+0

これを逃しました。ごめんなさい。はい、スルタンは正解です。 –

関連する問題