Тип "Bool" не соответствует протоколу "Sequence"

Я начал изучать Swift несколько недель назад, и на одном уроке (массивы и циклы for .. in) мне нужно было сделать функцию, которая подсчитывает голоса и дает ответ.

Итак, я сделал этот код, думая, что это так, но эта ошибка появляется -> «Тип« Bool »не соответствует протоколу« Последовательность »»

вот код:

func printResults(forIssue: String, withVotes: Bool) -> String {
    positive = 0
    negative = 0
    for votes in withVotes {
        if votes == true {
            positive += 1
        } else {
            negative += 1
        }
    }
    return "\(forIssue) \(positive) yes, \(negative) no"
}

Ошибка появляется в 4-й строке с «withVotes».

Уже есть массивы, которые получили значения типа Bool.


person Stefan Lukovic    schedule 16.03.2018    source источник
comment
withVotes в настоящее время не является массивом, может быть, вы это имели в виду?   -  person Kevin DiTraglia    schedule 17.03.2018
comment
Сообщение об ошибке совершенно ясное: Swift нужен Sequence, а вы дали ему Bool. Дайте ему последовательность, и он будет счастлив :).   -  person Cristik    schedule 17.03.2018


Ответы (3)


Добро пожаловать в изучение Swift! Вы наткнулись на что-то, где компилятор прав, но как новичок не всегда очевидно, что происходит.

В этом случае, хотя он указывает на строку 4 как на проблему, вам не нужно ее исправлять. Вам нужно перейти к источнику проблемы, в данном случае это строка 1, здесь...

func printResults(forIssue: String, withVotes: Bool) -> String {

В частности withVotes: Bool. Проблема в том, что из-за того, как вы это написали, вы можете передать только одно логическое значение. Судя по вашему вопросу и остальной части вашего кода, вы явно хотите передать несколько.

Для этого просто создайте логический массив, например... withVotes: [Bool] (Обратите внимание на квадратные скобки.)

Вот ваш обновленный код с изменением в строке 1, а не в строке 4. Обратите внимание, что я также обновил сигнатуру и имена переменных, чтобы они были более «быстрыми», если вы хотите, чтобы основное внимание всегда уделялось ясности:

func getFormattedResults(for issue: String, withVotes allVotes: [Bool]) -> String {

    var yesVotes = 0
    var noVotes  = 0

    for vote in allVotes {
        if vote {
            yesVotes += 1
        }
        else {
            noVotes += 1
        }
    }

    return "\(issue) \(yesVotes) yes, \(noVotes) no"
}

Надеюсь, это объясняет это немного больше, и снова добро пожаловать в семью Swift! :)

person Mark A. Donohoe    schedule 16.03.2018

Вам нужно передать массив следующим образом:

func printResults(forIssue: String, withVotes: [Bool]) -> String {
    positive = 0
    negative = 0
    for votes in withVotes {
        if votes == true {
            positive += 1
        } else {
            negative += 1
        }
    }
    return "\(forIssue) \(positive) yes, \(negative) no"
}
person Xcoder    schedule 16.03.2018

Компилятор прав. Вы пытаетесь перебрать логическое значение withVotes, которое не сработает.

Решение состоит в том, чтобы создать массив логических значений. Нравится подписаться

for i in [true, false, true] {
    if i == true { print("true") }

}

Измените свой параметр withVotes с Bool на [Bool] и компилятор будет счастлив :)

В конце наверное так и будет выглядеть

func printResults(forIssue: String, withVotes: [Bool]) -> String {
    positive = 0
    negative = 0
    for votes in withVotes {
        if votes == true {
            positive += 1
        } else {
            negative += 1
        }
    }
    return "\(forIssue) \(positive) yes, \(negative) no"
}
person BilalReffas    schedule 16.03.2018