测试“nil”和“.None”的可选项有啥区别?
Posted
技术标签:
【中文标题】测试“nil”和“.None”的可选项有啥区别?【英文标题】: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 ...
有什么区别?它会以某种方式影响我的应用程序/代码吗? 什么更好?
【问题讨论】:
【参考方案1】:在正常使用中没有区别,它们是可以互换的。 .None
是由Optional<T>
枚举实现的nil
(不存在)值的枚举表示。
.None
和 nil
的等价性归功于实现 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
的使用更为常见,是推荐的约定。
【讨论】:
以上是关于测试“nil”和“.None”的可选项有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
GNU Arm 嵌入式工具链 | arm-none-eabi-gcc 选项:Thumb (-mthumb) 和 Arm (-marm) 状态有啥区别?