我有休耕代码:
struct AInt {
var aInt: Int
}
struct ADouble {
var aDouble: Double
static func convert(aInt: AInt) throws -> ADouble {
return ADouble(aDouble: Double(aInt.aInt))
}
}
struct B {
func doAction(aInts: [AInt]) throws -> [ADouble] {
return aInts.map { aInt in
do {
try ADouble.convert(aInt)
}
catch {
print(error)
}
}
// ^^^ error here: Missing return in a closure expected to return 'ADouble'
}
}
let aInts = [AInt(aInt: 2), AInt(aInt: 3)]
let b = B()
do {
print(try b.doAction(aInts))
}
catch {}
当我试图使用
[AInt]
错误的函数将[ADouble]
中的.map
转换为throw
时,我得到这个错误:Missing return in a closure expected to return 'ADouble'
好吧,我决定在
return
末尾添加.map
语句,如下所示:return aInts.map { aInt in
do {
try ADouble.convert(aInt)
}
catch {
print(error)
}
return ADouble(aDouble: 2.2)
}
错误消失,但当我在同一个数组上打印
try b.doAction(aInts)
时,我得到这个:aInts
,即它打印我手动设置的[ADouble(aDouble: 2.2), ADouble(aDouble: 2.2)]
。显然,这不是我想要的,所以我尝试在ADouble(aDouble: 2.2)
之前添加return
如下:return aInts.map { aInt in
do {
return try ADouble.convert(aInt)
}
catch {
print(error)
}
return ADouble(aDouble: 2.2)
}
现在我得到了正确的结果:
try ADouble.convert(aInt)
。但如果在[ADouble(aDouble: 2.0), ADouble(aDouble: 3.0)]
结尾没有return
语句,此代码仍然无法工作。有什么办法可以摆脱它吗? 最佳答案
map()
方法声明为
@rethrows public func map<T>(@noescape transform: (Self.Generator.Element) throws -> T) rethrows -> [T]
这意味着(如果我理解正确的话)转换可以
返回一个值或抛出一个错误(这将是
转发给呼叫者)。
这将按预期编译并工作:
struct B {
func doAction(aInts: [AInt]) throws -> [ADouble] {
return try aInts.map { aInt in
return try ADouble.convert(aInt)
}
}
}
从
ADouble.convert(aInt)
引发的错误将转发到map()
的调用者,从那里到doAction()
的调用者。关于swift - “在一个闭包中缺少返回,预计会在.map中返回'SomeType'”错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32508841/