2017-04-19 75 views
-1

我想測試一個數組的數量是否大於0,否則關閉當前視圖。手動去捕捉語句... 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) 
} 

我想知道如果我可以手動發送do..catchcatch如果計數不大於0,這樣,我不不得不有self.dismiss(animated: true, completion: nil)寫兩次。有誰知道這是否可能?

回答

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() 
} 
+0

我喜歡你的回答比我的好,但我想他應該看到投擲是一種選擇。 –

+0

@DanielT。我不認爲在任何情況下拋出假的錯誤都是一個不錯的選擇。例如,您可以通過定義'let onError:() - > Void = {self.dismiss(...)}'來從兩個分支()中調用'onError'來消除重複。這比僞造錯誤還要好。 – Sulthan

+0

我同意,但可能有更大的背景,提問者或未來的讀者正在處理錯誤不會是假的地方。就像我說的那樣,你的回答對於所問的確切問題更好。 –

1

如果你拘泥於do塊,你可以這樣做:

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

這聽起來像你想使用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將保證該行代碼被調用的方法的出口。

+0

但是,如果代碼成功運行,則不需要調用'dismiss'。 – rmaddy

+0

錯過了該請求。抱歉。是的,蘇丹有正確的答案。 –