我正在尝试在Swift中为Alamofire做一个扩展,并且有这个代码:
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)
})
}
}
这给了我编译错误:
错误:(21,36)表达式类型不明确没有更多上下文
有趣的是,当我注释掉这一行时,它会编译:
// completionHandler(.Failure(result.error!))
如何为Swift提供足够的类型信息以使其正常工作?
答案 0 :(得分:1)
问题在于,我们不知道结果类型(.Failure(result.error!)
)的类型。作为失败案例,没有什么可以告诉编译器T将是什么。
您可以完整地写出Result<T,Error>.Failure(result.error!)
。
答案 1 :(得分:1)
我用它编译:
completionHandler(Result<T,Error>.Failure(result.error! as! Error))
一个问题是类型推断,另一个是result.error是可选的NSError。我不知道NSError是否可以转换为ErrorType tho ..
答案 2 :(得分: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