我正在使用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;。对我来说,这看起来并不复杂; mapError
将Error
传递到闭包中,并期望返回一个(或T:Error
),但我还是试着安抚Swift:
f.mapError() { (e: Error)->Error in
print(e)
return e
}
现在Swift说,&#34;错误:无法转换类型的值&#39;(错误) - &gt;错误&#39;预期参数类型&#39;(错误) - &gt; _&#39;&#34;
这个_
返回类型是什么?我应该怎么写封闭?
(我意识到我可以避免打电话给mapError
,但无论如何,我似乎无法称呼它。如果我真的想要,我怎么会这样做呢?)
答案 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}}返回类型是什么?
这意味着编译器无法确定类型,这可能会进一步说明发生了什么......