Проверить несколько значений в массиве - PullRequest
0 голосов
/ 29 августа 2018

У меня есть структура:

struct Info {
    var name: String = ""
    var number = Int()
    var count = Int()
}

var infoProvided : [Info] = []    

Я хочу проверить, введены ли имя и номер, и если да, обновить счетчик. Если ни имя, ни номер не указаны, я хочу добавить значения.
Как то так:

//Check if item allready exists, if not append to array
if let index = infoProvided.index(where: { $0.name == name }) && infoProvided.index(where: { $0.number == number })   {
    infoProvided[index].count += counter

} else {
    infoProvided.append(Info(name: name, number: number, count: counter))
}    

Приведенное выше решение не работает:

"Необязательный тип 'Array.Index?' (aka «Необязательно») не может использоваться как логическое значение; вместо этого проверьте «! = nil» *

Как я могу проверить, существуют ли два значения?

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Повторный поиск одних и тех же объектов с помощью index(where:) будет очень неэффективным (каждый вызов - это O(n) линейный поиск). Было бы лучше использовать словарь, который также радикально упростил бы вашу логику слияния / сложения:

struct Info { // TODO: NAME ME BETTER
    let name: String
    let number: Int  // TODO: NAME ME BETTER
}

... где-то еще в вашем коде:

var infoCounts = [Info: Int]

func addNewInfo(name: String, number: Int, count: Int) {
    infoCounts[Info(name: name, number: number), default: 0] += count
}
0 голосов
/ 29 августа 2018

Похоже, вы хотите обновить экземпляр Info, указав соответствующее имя и номер.

Для этого вам нужно проверить оба в одном вызове index(where:).

if let index = infoProvided.index(where: { $0.name == name && $0.number == number }) {
    infoProvided[index].count += counter
} else {
    infoProvided.append(Info(name: name, number: number, count: counter))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...