我有休耕代码:

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/

10-10 20:32