当我可以做if(var!= null)时,为什么选项有用?

时间:2018-02-14 16:20:09

标签: swift optional

问题:

为什么当我可以检查值是否为零时,Swift会使用类似选项的东西?从本质上讲,我想知道这种语言功能的用途是什么,我正在学习Swift atm,从初学者的角度来看,这似乎是多余/无用的。

P.S。:我来自Javascript。

CODE:

对我这样做似乎很荒谬:

if let normalImage = imageFromFaceBook {
  print(normalImage) // normalImage is a constant
} else {
  print("There is no image")
}

当我可以做的时候:

if (imageFromFacebook != nil) {
    print(imageFromFacebook) // normalImage is a constant
} else {
    print("There is no image")
}

就像我通常在Javascript中做的那样:

if (imageFromFacebook != null) {
    print(imageFromFacebook) // normalImage is a constant
} else {
    print("There is no image")
}

2 个答案:

答案 0 :(得分:7)

我认为关键的区别在于,Optionals允许类型系统表达什么时候可能是零或绝对不会。在Javascript中,您无法表达" var x将永远不会被定义,因此无需在任何地方添加该检查"同样地,在Javascript中,您可能有一个期望具有值的var,并且忘记以检查在某些情况下它是否未定义的可能性。

Optionals将这种区别提升为类型系统中的实际类型,因此编译器可以检测(并警告您)何时在nil是必须考虑的可能性的上下文中假设为非nil。类似地,编译器可以强制执行非可选类型,以永远设置为零值(这将违反期望非零值的相关代码的假设)。

换句话说,如果没有Optionals,只有运行时检查可以确定甚至的值是否为零(无法知道)。在Swift中,使用Optionals,类型本身可以指定是否必须考虑nil,因此编译器可以在构建时或甚至在您键入时验证安全性。

答案 1 :(得分:0)

在某些语言中,例如Objective-C,任何对象引用都可以是nil

斯威夫特更清晰,更安全。在Swift中,只有一个Optional可以是nil。因此,为了使您能够检查某些内容是否为nil,该内容必须首先是可选内容。

例如,你不能说:

let s : String = "howdy"
if s == nil {

这甚至都不会编译,因为s 永远不会成为nil;它是一个字符串,而不是一个可选项。只有一个可选的nil。这就是一个可选的 :它可以是nil