Swift函数编译器错误'缺少返回'

时间:2019-01-23 20:03:13

标签: swift function compiler-errors

我一直在尝试让该函数返回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调用具有相同元素数量的函数,也仍然遇到相同的错误。

3 个答案:

答案 0 :(得分:2)

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

现在,ClosedRange永远不会为空,因此b[0]...b.endIndex永远不会为空(如果结果为空或无效范围,则代码将崩溃),但编译器不会足够聪明知道这一点。

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

答案 1 :(得分:2)

如果您的数组没有元素怎么办?然后对于每个循环永远不会运行,然后您的方法将不会返回任何结果,这显然是错误的。因此,即使在循环之外,您也需要返回值。


但是,你的逻辑不好。您要返回布尔值,具体取决于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 :(得分:1)

您的函数无法处理b为空数组的情况。 在这种情况下,您需要定义返回值是什么,因为当b为空数组时,将跳过循环。

第二,您的逻辑也不完整,因为如果条件适合i == 0,您将立即返回true,而无需检查其余项。

第三,您可能要确保a和b的长度相同。

这就是您的函数的外观:

<View style={styles.AddressRow}>
  {item.Online !== '' && <TouchableOpacity  onPress={() => Linking.openURL(item.Online)}>
    <Text style={styles.underLineText}>Online</Text>
  </TouchableOpacity>}