collectionView.indexPathsForSelectedItems.contains (х) - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь запустить collectionView.selectItem(at: indexPath, animated: false, scrollPosition: []), если if(!collectionView.indexPathsForSelectedItems?.contains(x)) возвращает true.Но я не могу заставить его работать.

Я думал, что это как-то связано с опциями, но, похоже, это не так.

Я пытался if let, ? ?? ! и т. Д. Я создал необязательный объект index_path и до сих пор не могу заставить его работать.

Ответы [ 2 ]

1 голос
/ 21 июня 2019

Вы не можете иметь необязательный 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)

  1. isXSelected возвращает nil → элементы не выбраны, я должен выбрать x
  2. isXSelected возвращает true → ничего не делать
  3. isXSelected возвращает false → я должен выбрать x

Вы хотите выполнить код "select x" в обоих случаях 1 и 3, поэтому вы хотите проверить, не является ли isXSelected неверным. В заключение:

// solution 2
if collectionView.indexPathsForSelectedItems?.contains(x) != true {
    // select item..
}
0 голосов
/ 21 июня 2019

Результат

collectionView.indexPathsForSelectedItems?.contains(x)

является необязательным значением bool: Bool?. Swift не допускает неявное приведение к типу Bool. Чтобы решить эту проблему, создайте развертывание необязательного массива в необязательный массив indexPathsForSelectedItems:

if !(collectionView.indexPathsForSelectedItems?.contains(x) ?? false) {
   //TODO:select item
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...