Фильтрующий массив, который содержит необязательный - SearchBar

Снова установите ubuntu-desktop. Введите некоторую tty (ctrl + alt + F1) после загрузки или перейдите в Advanced Options for Ubuntu -> Recovery mode -> root из меню grub при загрузке (нажмите и удерживайте клавишу alt или пробел или esc или смените во время загрузки, если вы не видите меню grub) и выполните следующие команды:

sudo apt-get autoremove --purge ubuntu-desktop
sudo apt-get install -f #in order to fix any inconsistencies
sudo apt-get install ubuntu-desktop

ubuntu-desktop установит больше вещей, чем единство, которое вы, вероятно, удалили после установки, но это самый безопасный способ заставить его работать снова

0
задан 13 August 2018 в 14:31

1 ответ

Это интересная небольшая проблема, поэтому давайте ее обобщить. Вот наши тестовые данные, сопоставимые с вашим массивом GuestDetails:

struct S {
    var s1 : String
    var s2 : String?
    var s3 : String?
}

var array = [S]()
array.append(S(s1: "test", s2: "yo", s3: "ha"))
array.append(S(s1: "test", s2: nil, s3: nil))
array.append(S(s1: "Howdy", s2: "Bonjour", s3: "Hello"))

let target = "hello"

Некоторые свойства S являются необязательными, другие - нет.

Таким образом, проблема заключается в следующем: Filter array down to только те элементы, где любое свойство S содержит нашу строку target, используя сравнение без учета регистра.

Мы можем сделать это в одном утверждении:

let filteredArray = array.filter {
    [$0.s1,$0.s2,$0.s3].compactMap {$0}
        .map {$0.localizedCaseInsensitiveContains(target)}
        .contains(true)
}

Это не так эффективно, как что написал @Ladislav, потому что мы продолжаем цикл внутри map даже после того, как мы нашли нашу строку. Но неэффективность, вероятно, невелика.

2
ответ дан 15 August 2018 в 17:03

Другие вопросы по тегам:

Похожие вопросы: