Вы не можете иметь необязательный Bool?
в качестве единственного члена условия if. Это потому, что компилятор (по уважительной причине) отказывается выводить, что он должен делать, когда получает нулевое значение.
У вас есть несколько способов решить эту проблему, важная вещь: убедитесь, что вы обрабатываете дело nil
так, как вы намереваетесь.
Из быстрого просмотра документации мы узнаем, что indexPathsForSelectedItems
возвращает nil
, если нет выбранных элементов. В этом случае ваше условие должно привести к значению true
, поскольку при отсутствии выбранных элементов x , скорее всего, не содержится в массиве выбранных значений.
Итак, первое решение может заключаться в том, чтобы сказать компилятору обрабатывать значение nil из indexPathsForSelectedItems
как пустой массив, что представляется вполне разумным: если нет выбранных элементов, массив, представляющий indexPath выбранных элементов, должен быть пусто:
// solution 1
if !(collectionView.indexPathsForSelectedItems ?? []).contains(x) {
// select item..
}
У вас есть второй способ решить эту проблему, если вы считаете, что у вас не может быть необязательного Bool?
внутри условия if, но вы всегда можете сравнить Bool?
с Bool
и, таким образом, явно сообщить компилятору единственный случай среди трех интересующих вас:
let isXSelected = collectionView.indexPathsForSelectedItems?.contains(x)
isXSelected
возвращает nil
→ элементы не выбраны, я должен выбрать x
isXSelected
возвращает true
→ ничего не делать
isXSelected
возвращает false
→ я должен выбрать x
Вы хотите выполнить код "select x" в обоих случаях 1 и 3, поэтому вы хотите проверить, не является ли isXSelected
неверным. В заключение:
// solution 2
if collectionView.indexPathsForSelectedItems?.contains(x) != true {
// select item..
}