-1

配列のカウントが 0 より大きいかどうかをテストし、そうでない場合は現在のビューを閉じます。

今、私は次のようにしています:

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)
}

do..catchカウントが 0 より大きくない場合、手動でをに送信できるかどうか疑問に思っています。そうすれば、 2 回書き込むcatch必要はありません。self.dismiss(animated: true, completion: nil)これが可能かどうか誰にもわかりますか?

4

3 に答える 3

4

明らかに気にしないので、代わりにerror使用できます:try?do-catch

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))

別のオプションは、複製されたコードを関数/クロージャに移動することです。

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()
}
于 2017-04-19T16:07:17.023 に答える
0

を使用してみたいと思われますdefer

guard状態が戻っていません。それは問題です。

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

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.
}

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

于 2017-04-19T16:12:33.607 に答える