2016-09-14 70 views
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)) 
    } 

這個解決方案很好。但就像在我的例子中那樣,我們並不總是需要通過任何值或錯誤作爲參數。無論如何,編譯器總是需要知道什麼類型的泛型參數應該是。所以即使我不計算什麼類型的值,我總是應該至少在那裏存儲AnyAnyObject。它過於複雜。

我試着級的解決方案來改變它:

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?或者現在只有使用這種方法的醜陋方式?

回答

1

Swift 3 added generic type aliases。這些可能會幫助您避免每次輸入所有類型。

實施例:

typealias AnyResult<E> = CallbackResult<Any, E> 
typealias AnyCallback<E> = (AnyResult<E>) ->() 

func foo(callback: AnyCallback<String>?) { 
    callback?(.failure(error: "Ouch!")) 
} 

foo() { result in 
    if result.isSuccess { 
     // ... 
    } 
} 
+0

它的工作原理部分。當我使用這個:typealias AnyCallback =(AnyResult ) - >(),我得到一個錯誤'Segmentation'錯誤:11 –