消除复杂闭包返回类型的歧义(foo - > _)

时间:2017-09-27 20:42:09

标签: swift alamofire

我正在使用Alamofire的Result课程。我已将Result简化为一个简单的子集进行演示。

public enum Result<Value> {
    case success(Value)
    case failure(Error)
}

extension Result {
    /// Evaluates the specified closure when the `Result` is a failure, passing the unwrapped error as a parameter.
    public func mapError<T: Error>(_ transform: (Error) -> T) -> Result {
        switch self {
        case .failure(let error):
            return .failure(transform(error))
        case .success:
            return self
        }
    }
}

我无法调用mapError进行编译。

我制作了一个简单的Error课程和几个结果:

class MyError: Error { }

let s: Result<Bool> = .success(true)
let f: Result<Bool> = .failure(MyError())

现在我可以打电话给mapError!也许我会在传递错误之前打印任何错误:

f.mapError() { 
    print($0)
    return $0
}

这里Swift告诉我&#34;错误:无法推断出复杂的闭包返回类型;添加显式类型以消除歧义&#34;。对我来说,这看起来并不复杂; mapErrorError传递到闭包中,并期望返回一个(或T:Error),但我还是试着安抚Swift:

f.mapError() { (e: Error)->Error in
    print(e)
    return e
}

现在Swift说,&#34;错误:无法转换类型的值&#39;(错误) - &gt;错误&#39;预期参数类型&#39;(错误) - &gt; _&#39;&#34;

这个_返回类型是什么?我应该怎么写封闭?

(我意识到我可以避免打电话给mapError,但无论如何,我似乎无法称呼它。如果我真的想要,我怎么会这样做呢?)

2 个答案:

答案 0 :(得分:4)

您无法将def safe_list(input_list): # initialize an output list output_list = [] # iterate through input list for value in input_list: try: # try to parse value as int parsed = int(value) except ValueError: # if it fails, append 0 to output list output_list.append(0) else: # if it succeeds, append the parsed value (an int) to # the output list. # note: this could also be done inside the `try` block, # but putting the "non-throwing" statements which follow # inside an else block is considered good practice output_list.append(parsed) return output_list 类型的闭包传递给(Error) -> Error 因为a protocol does not conform to itself,即mapError不是 约束Error的有效T

使<T: Error>非通用

mapError

将两个用法示例编译。

答案 1 :(得分:0)

  

错误中的{{1}}返回类型是什么?

这意味着编译器无法确定类型,这可能会进一步说明发生了什么......