2
我試圖爲應用程序中的每個回調實現一些單一的解決方案。所以我希望任何回調都使用同一個類,或者至少一個類。具有默認值的Swift仿製藥
- 每個回調都可以成功或不成功。
- 如果成功,它可以包含一些操作結果 。
- 如果不是,它可以包含有關它失敗的信息。
常見的回調用法是這樣的:
func foo(callback: ((success: Bool, result: Result?, error: Error?) -> Void)?) { }
或者:
func foo(success: ((result: Result) -> Void)?, failure: ((error: Error) -> Void)?) { }
我不喜歡任何人。我希望每個回調都有一個優雅的解決方案。我在Alamofire庫中找到類似的東西。
enum CallbackResult<T, V> {
case success(value: T?)
case failure(error: V?)
var isSuccess: Bool {
switch self {
case .success: return true
case .failure: return false
}
}
}
func foo(callback: ((result: CallbackResult<Any, AnyObject>) -> Void)?) {
callback?(result: .success(value: nil))
}
這個解決方案很好。但就像在我的例子中那樣,我們並不總是需要通過任何值或錯誤作爲參數。無論如何,編譯器總是需要知道什麼類型的泛型參數應該是。所以即使我不計算什麼類型的值,我總是應該至少在那裏存儲Any
或AnyObject
。它過於複雜。
我試着級的解決方案來改變它:
class CallbackResult<T, V> {
let isSuccess: Bool
let value: T?
let error: V?
fileprivate init(success: Bool, value: T? = nil, error: V? = nil) {
self.isSuccess = success
self.value = value
self.error = error
}
static func success(value: T? = nil) -> CallbackResult {
return CallbackResult(success: true, value: value)
}
static func failure(error: V? = nil) -> CallbackResult {
return CallbackResult(success: false, error: error)
}
}
func foo(callback: ((result: CallbackResult<Any, AnyObject>) -> Void)?) {
callback?(result: CallbackResult.success(value: nil))
}
它具有相同的功能。但即使這樣,它也沒有解決我的問題。你不能這樣寫:
CallbackResult<_, Error>
它不會工作。
也許有人知道我的問題的解決方案?有些方法可以設置默認值^不要每次都寫Any
?或者現在只有使用這種方法的醜陋方式?
它的工作原理部分。當我使用這個:typealias AnyCallback =(AnyResult ) - >(),我得到一個錯誤'Segmentation'錯誤:11 –