Снова установите 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 установит больше вещей, чем единство, которое вы, вероятно, удалили после установки, но это самый безопасный способ заставить его работать снова
Это интересная небольшая проблема, поэтому давайте ее обобщить. Вот наши тестовые данные, сопоставимые с вашим массивом 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 даже после того, как мы нашли нашу строку. Но неэффективность, вероятно, невелика.