Xcode 迅捷式的表达是含糊不清的,没有更多的上下文

Xcode 迅捷式的表达是含糊不清的,没有更多的上下文,xcode,swift,swift2,swift2.1,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&

我正在尝试在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)
        })

    }
}

我如何给Swift提供足够的类型信息以使其工作

问题是is不知道结果类型(
.Failure(Result.error!)
)是什么类型。作为失败案例,没有任何东西可以告诉编译器T将是什么

您可以完整地写出
Result.Failure(Result.error!)

扩展请求
{
//此函数声明返回类型Self(aka请求)
func responseObject(completionHandler:Result->Void)->Self
{
//你回来了…我不知道,但是类型
//是函数responseJSON的返回类型,
//可能也是空的
返回responseJSON(completionHandler:{r in
设result=r.result
guard result.issueccess else{
completionHandler(.Failure(result.error!))
//在这里,您返回无效
返回
}
让obj:T?=T(json:result.value为!NSObject)
让成功:结果=.success(obj!)
completionHandler(成功)
})
}
}
我想你需要像这样的东西

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

我用以下代码编译它:

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

一个问题是类型推断,另一个问题是result.error是可选的N错误。我不知道NSError是否可以转换为ErrorType tho..

我有点惊讶,作为完成处理程序的参数并没有提供足够的类型上下文。
func responseObject<T : JsonResponse, Error: ErrorType>(completionHandler : Result<T,Error> -> Void) -> Void
completionHandler(Result<T,Error>.Failure(result.error! as! Error))