【问题标题】:Swift unwrapping for multiple optionals多个选项的快速解包
【发布时间】:2016-06-24 13:03:17
【问题描述】:

我认为这是可能的,但似乎无法让它发挥作用。我确定我只是在愚蠢。我试图以

的形式输出格式化的地址
"one, two, three"

来自一组可选组件(一个、两个、三个)。如果 "two" 为 nil,则输出为

"one, three"

let one: String?
let two: String?
let three: String?

one = "one"
two = nil
three = "three"

if let one = one,
        two = two,
        three = three {
     print("\(one),\(two),\(three)")
}

【问题讨论】:

  • print("\(one ?? ""),\(two ?? ""),\(three ?? "")"),也许吧。
  • 如果一些但不是所有变量都为零,您期望什么输出? if one ?? two ?? three != nil 检查是否至少有一个非零,但不展开。 [one, two, three].flatMap { $0 } 给出非零变量的列表,展开。
  • 我以“不清楚您的要求”投票结束,但如果问题更新,我很乐意撤销投票。
  • @MartinR 对任何混淆感到抱歉。我试图从一组可选组件(地址、城市、国家等)中输出格式化的地址(以“地址、城市、国家/地区”的形式)。如果城市为 nil,则输出将为“地址、国家/地区”。看起来你的 flatMap 想法会起作用
  • @Danny:我撤回了我的最后一票,但您应该更新 question 本身以澄清您的问题(没有人会阅读所有 cmets)。

标签: swift optional unwrap


【解决方案1】:

我不知道你为什么需要这个,但是接受它 =)

if let _ = one ?? two ?? three {
    print("\(one),\(two),\(three)")
}

【讨论】:

  • if one != nil || two != nil || three != nil 会更具可读性,因为您并没有真正打开包装,而只是检查 nil
  • @Sulthan 在我的解决方案中,字母较少,而且实际上没有人需要它 =)
  • 有时是这样。记住递归函数。不过,Martin R 的回答最为正确和优雅。
  • 更少的字母,更少的代码行从来都不是一个好的指标。代码复杂性和可读性是更好的指标。
  • 我的案例更具可读性,您的案例 - 大而混乱;虽然它稍微快一点,但在这种情况下你永远感觉不到它,这就是我的意思。没有人认为减少行数/字母本身就能带来更好的代码质量。
【解决方案2】:

如果您尝试将非nil 值打印为逗号分隔的列表,那么我认为@MartinR 建议使用flatMap() 是最好的:

let one: String?
let two: String?
let three: String?

one = "one"
two = nil
three = "three"

let nonNils = [one, two, three].flatMap { $0 }
if !nonNils.isEmpty {
    print(nonNils.joinWithSeparator(","))
}

输出:

one,three

【讨论】:

    猜你喜欢
    • 2021-10-02
    • 2015-12-10
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多