Тернарная развертка в Swift

В Swift я использую этот код:

var categories: Results<Category>? //Realm dataType

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    if let categories = categories, !categories.isEmpty {
        return categories.count
    } else {
        return 1
    }
}

Сейчас я пытаюсь структурировать код для моего tableView как тернарный оператор, но не знаю, как это сделать. Я нашел следующую страницу: https://dev.to/danielinoa_/ternary-unwrapping-in-swift-903, но мне это все еще неясно.

Что я пробовал:

return categories?.isEmpty ?? {($0).count} | 1

or

let result = categories?.isEmpty ?? {($0).count} | 1
return result

но оба дают ошибки. Есть идеи, как я могу это решить?


person Bjorn Morrhaye    schedule 12.08.2018    source источник
comment
чего вы хотите добиться?   -  person vivekDas    schedule 12.08.2018
comment
просто сократите мой код :)   -  person Bjorn Morrhaye    schedule 12.08.2018
comment
Зачем возвращать 1, если массив равен нулю? Разве это не должно быть 0?   -  person Joakim Danielson    schedule 12.08.2018
comment
Я всегда хочу вернуть строку в моем tableView. Если мой массив не содержит элементов, ячейка работает как заполнитель. Стандартное значение ячейки тогда, пожалуйста, добавьте элементы   -  person Bjorn Morrhaye    schedule 12.08.2018
comment
Приведенный вами пример кода требует специальной реализации инфиксных операторов ?? и |, что не очевидно при первом просмотре сообщения в блоге. Хотя получившийся код элегантен, я предпочитаю нативное решение Optional.map(), представленное ниже.   -  person gyratory circus    schedule 30.04.2019


Ответы (2)


Вместо троичного вы можете использовать Optional.map, чтобы сделать его еще проще:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return categories.map { $0.count } ?? 1
}

Или смешивание Optional.map и троичного, чтобы достичь того, чего вы, как я думаю, пытаетесь достичь:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return categories.map { !$0.isEmpty ? $0.count : 1 } ?? 1
}
person Michał Kwiecień    schedule 12.08.2018
comment
Спасибо за это. ! я не знал о карте. Не могли бы вы немного объяснить, потому что я немного смущен. category.map разворачивает необязательное значение, затем я проверяю, не является ли развернутое значение пустым. Если не пусто, я возвращаю количество значений, если оно пусто, я возвращаю 1, но что делает последняя часть? от ?? 1 - person Bjorn Morrhaye; 12.08.2018
comment
Ваши categories являются необязательными, поэтому они могут иметь какое-то значение или нет. В этом случае нужно проверить три случая: 1. categories равны нулю, 2. categories не равны нулю, а isEmpty = true, 3. categories не равны нулю и isEmpty = false. Последняя часть, о которой вы спрашиваете, - это убедиться, что отображается правильное значение в случае номер 1. - person Michał Kwiecień; 12.08.2018
comment
вижу, идеально! спасибо за решение и объяснение! очень признателен ! - person Bjorn Morrhaye; 12.08.2018

Вернуть 1 для nil и пустого массива, иначе значение count

return (categories?.count ?? 1) + (categories?.isEmpty ?? false ? 1 : 0)
person Joakim Danielson    schedule 12.08.2018