Swift - 没有更多上下文的表达类型

时间:2015-11-20 13:48:16

标签: xcode swift swift2 swift2.1

我正在尝试在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提供足够的类型信息以使其正常工作?

3 个答案:

答案 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