【问题标题】:Swift function compiler error 'missing return'Swift 函数编译器错误“缺少返回”
【发布时间】:2019-01-23 20:03:12
【问题描述】:

我一直试图让这个函数返回一个 Bool 值,但我不明白为什么我会收到错误“在预期返回 'Bool' 的函数中缺少返回。我一直在网上四处寻找并尝试了不同的方法,但我似乎找不到解决方案。任何帮助将不胜感激!

func trueSquare(a:[Int], b:[Int]) -> Bool {
    for i in b[0]...b.endIndex {
        if b[i] == a[i]*a[i] {
            return true
        }
        else {
            return false
        }
    }
}

编辑:我已将循环更改为 for i in 0...(b.count - 1),但即使我使用 a 和 b 都具有相同数量的元素调用该函数,我仍然遇到相同的错误。

【问题讨论】:

  • 您会收到该错误,因为如果 b 数组为空并且您永远无法运行 for 循环会发生什么?此外,您尝试检查是否 b[i] == a[i]*a[i] 但如果 a 的元素少于 b,这将崩溃。
  • 如果b.endIndex 小于b[0] 怎么办?
  • return zip(a, b).contains(where: { $0 * $0 == $1 }) 之类的东西可能是获得结果的更简单方法。
  • 除此之外,在任何情况下,循环都不会超过第一次迭代。
  • @DanHilton 如果你想迭代整个循环,你不能在循环中使用return

标签: swift function compiler-errors


【解决方案1】:

如果你的数组没有元素怎么办?然后对于每个循环都不会运行,然后您的方法不会返回任何明显错误的内容。所以你需要在循环之外返回值。


但是,你的逻辑很糟糕。您返回的布尔值取决于 b 中的 first 元素是否等于 a*a

所以,逻辑应该是这样的:如果每个元素都满足条件,则返回true,否则返回false。为此,在 Swift 4.2+ 中,您可以使用方法 allSatisfy

func trueSquare(a:[Int], b:[Int]) -> Bool {
    guard a.count == b.count else { return false } // if arrays have different number of elements, return false
    return a.enumerated().allSatisfy {$0.element * $0.element == b[$0.offset]}
}

【讨论】:

    【解决方案2】:

    我怀疑编译器在根本不执行循环的情况下需要返回值。

    现在,ClosedRange 永远不会为空,所以 b[0]...b.endIndex 永远不会为空(如果它导致空范围或无效范围,代码会崩溃),但编译器不够聪明,无法知道那个。

    PS:你确定b[0]...b.endIndex 实际上是你想要循环的序列吗?这将创建从b 的第一个元素bendIndex 的范围。这对我来说没有任何意义。

    【讨论】:

    • 我已将循环更改为 'for i in 0...(b.count - 1)' 并尝试设置 a:[4, 8, 16, 20], b :[16, 64, 122, 200] 但仍然出现同样的错误
    【解决方案3】:

    您的函数不处理 b 为空数组的情况。 对于这种情况,您需要定义您希望返回值是什么,因为当 b 为空数组时,您的循环将被跳过。

    其次,你的逻辑也是不完整的,因为如果条件对 i​​==0 是好的,你立即返回 true,而不检查其余的项。

    第三,您可能希望确保 a 和 b 具有相同的长度。

    所以你的函数应该是这样的:

    func trueSquare(a:[Int], b:[Int]) -> Bool {
        if a.count != b.count {
            return false
        }
        for i in 0..<b.count {
            if b[i] != a[i]*a[i] {
                return false
            }
        }
        return true
    }
    

    【讨论】:

      猜你喜欢
      • 2015-06-01
      • 1970-01-01
      • 2014-08-20
      • 1970-01-01
      • 2013-10-27
      • 2020-09-04
      • 1970-01-01
      • 2014-03-19
      • 2011-08-10
      相关资源
      最近更新 更多