2015-11-20 14 views
0

我試圖做出Alamofire在斯威夫特的延伸,並有這樣的代碼:斯威夫特 - 表達的類型是ambigious沒有更多的上下文

import Foundation 
import Alamofire 

protocol JsonResponse 
{ 
    init?(json : NSObject) 
} 

extension Request 
{ 
    func responseObject<T : JsonResponse, Error: ErrorType>(completionHandler : Result<T,Error> -> Void) -> Self 
    { 
     return responseJSON(completionHandler: {r in 
      let result = r.result 
      guard result.isSuccess else { 
       completionHandler(.Failure(result.error!)) 
       return 
      } 
      let obj : T? = T(json : result.value as! NSObject) 
      let success : Result<T,Error> = .Success(obj!) 
      completionHandler(success) 
     }) 

    } 
} 

這使我的編譯器錯誤:

Error:(21, 36) type of expression is ambiguous without more context

有趣的是,當我註釋掉這一行,它編譯:

// completionHandler(.Failure(result.error!)) 

如何給斯威夫特足夠的類型信息使這項工作?

回答

1

問題是,不知道結果類型的類型(.Failure(result.error!))是。作爲失敗案例,沒有什麼能夠告訴編譯器T是什麼。

你可以把它寫滿Result<T,Error>.Failure(result.error!)

+1

作爲完成處理程序的參數沒有提供足夠的類型上下文,我有點驚訝。 –

0
extension Request 
{ 
    // this function declares return type Self (aka Request) 
    func responseObject<T : JsonResponse, Error: ErrorType>(completionHandler : Result<T,Error> -> Void) -> Self 
    { 
     // here you return ... I don't know, but the type 
     // is return type of the function responseJSON, 
     // probably Void too 
     return responseJSON(completionHandler: {r in 
      let result = r.result 
      guard result.isSuccess else { 
       completionHandler(.Failure(result.error!)) 
       // here you return Void 
       return 
      } 
      let obj : T? = T(json : result.value as! NSObject) 
      let success : Result<T,Error> = .Success(obj!) 
      completionHandler(success) 
     }) 

    } 
} 

我猜你需要像

func responseObject<T : JsonResponse, Error: ErrorType>(completionHandler : Result<T,Error> -> Void) -> Void 
1

我把它編譯如下:

completionHandler(Result<T,Error>.Failure(result.error! as! Error)) 

的一個問題是類型推理,另一個是result.error是可選的NSError。我不知道NSError是否可以轉換爲ErrorType tho ..