0

我正在尝试在 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 提供足够的类型信息来完成这项工作?

4

3 回答 3

1

问题是它不知道 Result 类型 ( .Failure(result.error!)) 的类型。作为失败案例,没有什么可以告诉编译器 T 将是什么。

你可以把它完整地写出来Result<T,Error>.Failure(result.error!)

于 2015-11-20T14:07:45.717 回答
1

我用这个编译它:

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

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

于 2015-11-20T14:22:55.607 回答
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
于 2015-11-20T14:19:10.560 回答