【问题标题】:Ternary Unwrapping in swift快速三元展开
【发布时间】:2019-01-19 07:12:39
【问题描述】:

我很快就使用了这个代码:

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

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

但两者都给出错误。知道如何解决这个问题吗?

【问题讨论】:

  • 你想达到什么目的?
  • 只是缩短我的代码:)
  • 如果数组为 nil,为什么要返回 1?不应该是0吗?
  • 我总是想在我的 tableView 中返回一行。如果我的数组不包含任何项目,则单元格的功能类似于占位符。单元格的标准值是“请添加项目”
  • 您提供的代码示例需要专门实现??|中缀运算符,这在第一次浏览博文时并不明显。虽然生成的代码很优雅,但我更喜欢下面提供的原生 Optional.map() 解决方案。

标签: ios swift optional ternary-operator unwrap


【解决方案1】:

您可以使用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
}

【讨论】:

  • 谢谢。 !我不知道“地图”。你能解释一下吗,因为我有点困惑。 categories.map 解包可选,然后我检查解包的值是否不为空。如果不为空,则返回值的计数,如果为空,则返回 1,但最后一部分是做什么的?从 ?? 1
  • 你的categories 是可选的,所以它可能有一些价值或没有。在这种情况下要检查三种情况:1.categories 为 nil,2.categories 不是 nil 但isEmpty = true,3.categories 不是 nil 和 isEmpty = false。您要询问的最后一部分是确保在案例 1 中显示正确的值。
  • 我明白了,完美!感谢您的解决方案和解释!非常感谢!
【解决方案2】:

nil 和空数组返回 1,否则返回 count 的值

return (categories?.count ?? 1) + (categories?.isEmpty ?? false ? 1 : 0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    相关资源
    最近更新 更多