switch error {
case Project.Client.LoadError.operationFailed(let error2):
switch error2 {
case Project.Client.APIClientError.invalidStatusCode(let message, _):
guard message != nil, message == "error" else {
return refresh()
}
delegate?.error(invalidScript)
default:
refresh()
}
default:
refresh()
}
這是我當前的代碼。這行得通,但我覺得有更好的方法來做到這一點。我怎樣才能error2不通過另一個switch陳述句,而只是將其轉換為invalidStatusCode我可以使用的陳述句?
或者,我可以搜索哪些術語以更好地了解這里發生的事情/了解自己要查找什么來尋找答案?因為我可能不完全理解 switch 陳述句作為轉換型別。
先感謝您。
uj5u.com熱心網友回復:
列舉與關聯值的模式匹配是可組合的,因此您可以這樣做:
switch error {
case Project.Client.LoadError.operationFailed(Project.Client.APIClientError.invalidStatusCode("error" , _)):
delegate?.error(invalidScript)
default:
refresh()
}
您可能會注意到這有點難以閱讀,因為這些完全限定的型別名稱有多長。
我懷疑 of 的型別error是 general Error,但在其他情況下,如果error已知的型別是Project.Client.LoadError,那么您可以使用.operationFailed(留下從背景關系推斷的型別)。如果.operationFailed已知關聯型別具有型別Project.Client.APIClientError,則可以使用.invalidStatusCode.
如果沒有,您可以使用一些本地型別別名來幫助解決這個問題:
typealias LoadError = Project.Client.LoadError
typealias APIClientError = Project.Client.APIClientError
switch error {
case LoadError.operationFailed(APIClientError.invalidStatusCode("error", _)):
delegate?.error(invalidScript)
default:
refresh()
}
uj5u.com熱心網友回復:
由于您只是深入研究兩個開關的一個案例,因此您根本不需要任何開關。你可以if case改用。概括地說,假設我們有這個:
enum Outer {
case inner(Inner)
case other
}
enum Inner {
case message(String)
case other
}
現在假設subject可能是一個外部。然后要確定這是一個 Outer 的.inner情況,其 Inner 值為.message并且該訊息的值為“howdy”,我們可以說:
if case Outer.inner(let inner) = subject,
case Inner.message(let message) = inner,
message == "howdy" {
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/512390.html
上一篇:在目標C中呼叫Swift函式
