Тернарно разгръщане в 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 за нула и празен масив, в противен случай стойността на count

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