【问题标题】:What's the difference between testing an optional for "nil" and ".None"?测试“nil”和“.None”的可选项有什么区别?
【发布时间】:2014-10-14 14:15:18
【问题描述】:

我在 swift 语言中随处可见,人们使用 if 语句测试可选值,以便他们可以安全地强制展开,有两种方式:

if optionalValue != .None {   

... some code ...

}

if optionalValue != nil {   

... some code ...

}

有什么区别?它会以某种方式影响我的应用程序/代码吗? 什么更好?

【问题讨论】:

    标签: ios swift optional-values


    【解决方案1】:

    在正常使用中没有区别,它们是可以互换的。 .None 是由Optional<T> 枚举实现的nil(不存在)值的枚举表示。

    .Nonenil 的等价性归功于实现 NilLiteralConvertible 协议的 Optional<T> 类型,以及 !=== 运算符的重载。

    如果您希望 nil 可赋值,您可以在自己的类/结构/枚举中实现该协议,例如:

    struct MyStruct : NilLiteralConvertible {
        static func convertFromNilLiteral() -> MyStruct {
            return MyStruct() // <== here you should provide your own implementation
        }
    }
    
    var t: MyStruct = nil
    

    (注意变量没有声明为可选)

    【讨论】:

      【解决方案2】:

      如果您通过命令单击单词.None,答案很容易获得。以下是 Swift 软件包所揭示的内容:

      enum Optional<T> : Reflectable, NilLiteralConvertible {
          case None
          case Some(T)
          init()
          init(_ some: T)
      
          /// Haskell's fmap, which was mis-named
          func map<U>(f: (T) -> U) -> U?
          func getMirror() -> MirrorType
          static func convertFromNilLiteral() -> T?
      }
      

      所以在大多数情况下,您可以使用其中任何一种,因为可选值应符合协议NilLiteralConvertible(尽管我不确定最后一点)。

      【讨论】:

        【解决方案3】:

        没有区别,.none(基本上就是Optional.none)和nil是等价的。

        事实上,这条语句在操场上运行,那么它的输出是true

        nil == .none || print(nil == .none) -> true
        

        nil 的使用更为常见,是推荐的约定。

        【讨论】:

          猜你喜欢
          • 2014-02-23
          • 2023-03-17
          • 1970-01-01
          • 1970-01-01
          • 2017-10-22
          • 2018-02-18
          • 1970-01-01
          相关资源
          最近更新 更多