Ошибка компилятора функции Swift «отсутствует возврат» - PullRequest
0 голосов
/ 23 января 2019

Я пытался заставить эту функцию возвращать значение 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 голосов
/ 24 января 2019

Ваша функция не обрабатывает случай, когда 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
}
0 голосов
/ 24 января 2019

Что если в вашем массиве нет элемента? Тогда для каждого цикла никогда не выполняется, а затем ваш метод не возвращает ничего, что, очевидно, неправильно. Поэтому вам нужно возвращать значение даже вне цикла.


Но ваша логика плохая. Вы возвращаете логическое значение в зависимости от того, равен ли первый элемент из b 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]}
}
0 голосов
/ 23 января 2019

Я подозреваю, что компилятору требуется возвращаемое значение для случая, когда цикл вообще не выполняется.

Теперь ClosedRange никогда не может быть пустым, поэтому b[0]...b.endIndex никогда не будет пустым(если он приведет к пустому или недопустимому диапазону, код будет аварийно завершен), но компилятор не настолько умен, чтобы это знать.

PS: Вы уверены, что b[0]...b.endIndex на самом деле последовательность, которую вы хотите зациклить?над.Это создает диапазон от первого элемента из b до endIndex из b.Это не имеет никакого смысла для меня.

...