【问题标题】:Does Swift have an “or equals” function like ||= in Ruby?Swift 有像 Ruby 中的 ||= 这样的“或等于”函数吗?
【发布时间】:2016-06-10 03:42:48
【问题描述】:

在 Swift 中,我如何设置可选的 foo,但前提是它是 nil

我知道Swift's nil coalescing operator

foo = foo ?? "Hello"(其中foo 是可选的String

但是,有没有更好的方法,比如在 Ruby 中?

foo ||= "Hello"

【问题讨论】:

    标签: swift null-coalescing-operator


    【解决方案1】:

    这样的算子被考虑拒绝了:https://github.com/apple/swift-evolution/blob/master/proposals/0024-optional-value-setter.md

    拒绝背后的原因应该是在 swift-evolution 电子邮件列表中,但上面附加的链接指向 SE-0025 而不是 24。

    这是理性的链接(因 Kenneth Bruno 的评论而编辑):http://article.gmane.org/gmane.comp.lang.swift.evolution/7694

    【讨论】:

    • 好吧……在那个线程中,没有一个评论者不赞成采用它。好奇为什么提案被标记为拒绝?
    • 在阅读了一些评论之后,似乎最终的分析是,因为它不会使 var 成为非可选的(?? op 返回非可选的),所以它会非常有限用处。这对我来说很有意义。
    • 其实我相信这是张贴的link to the rationale
    【解决方案2】:

    不,就是这样。如果你愿意,你可以把它包装在你自己的运营商中:

    infix operator ||= {}
    func ||=<T>(inout left: Optional<T>, right: T) { left = left ?? right }
    
    var foo:String? = nil // foo -> nil
    foo ||= "Hello"       // foo -> "Hello"
    foo ||= "Hi"          // foo -> "Hello"
    

    我建议使用??= 来匹配foo = foo ?? "Hello" 模式,但请使用您觉得舒服的任何东西。

    【讨论】:

      【解决方案3】:

      对于 Swift 5.1

      infix operator ||=
      func ||=<T>(lhs: inout Optional<T>, rhs: @autoclosure () -> T) { lhs = lhs ?? rhs() }
      
      var foo:String? = nil // foo -> nil
      foo ||= "Hello"       // foo -> "Hello"
      foo ||= "Hi"          // foo -> "Hello"
      

      请参阅此处了解@autoclosure 如此重要的原因:https://airspeedvelocity.net/2014/06/10/implementing-rubys-operator-in-swift/

      【讨论】:

        【解决方案4】:

        对于 Swift 3 中的 Bool 类型:

        infix operator ||=
        func ||=(lhs: inout Bool, rhs: Bool) { lhs = (lhs || rhs) }
        

        用法:

        var bool = false
        bool ||= false // false
        bool ||= true // true
        bool ||= false // true
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-19
          • 1970-01-01
          • 2012-03-03
          • 1970-01-01
          • 2014-12-15
          • 2015-06-22
          相关资源
          最近更新 更多