关于在Swift中声明期权和非期权
我相信这可能是一个重复,但我找不到任何整洁和紧凑的解释,所以它来了 我们都知道,如果我们声明这样一个变量关于在Swift中声明期权和非期权,swift,optional,Swift,Optional,我相信这可能是一个重复,但我找不到任何整洁和紧凑的解释,所以它来了 我们都知道,如果我们声明这样一个变量 1> var a : String? 我们有一个可选的 a: String? = nil 如果我们省略?我们必须在创建时将a初始化为nil以外的值。然而,如果我们说 2> var a : String! 我们得到 a: String! = nil 这让我非常困惑,因为我假设该声明意味着a不能是可选的。因此,通过使用REPL,我得到了以下令人困惑的结果: 3> a!
1> var a : String?
我们有一个可选的
a: String? = nil
如果我们省略?
我们必须在创建时将a
初始化为nil
以外的值。然而,如果我们说
2> var a : String!
我们得到
a: String! = nil
这让我非常困惑,因为我假设该声明意味着a
不能是可选的。因此,通过使用REPL,我得到了以下令人困惑的结果:
3> a!
fatal error: unexpectedly found nil while unwrapping an Optional value
4> a as! String
fatal error: unexpectedly found nil while unwrapping an Optional value
5> a as! String?
$R2: String? = nil
6> a as? String
fatal error: unexpectedly found nil while unwrapping an Optional value
7> a as? String!
$R3: String!? = nil
有人能解释一下吗?
var a:String
是我们称之为隐式展开的可选项。它是一个可选选项,可以保存nil
的值,但编译器不会产生任何与此相关的编译时错误
如果它有一个nil值,并且被使用,您将得到一个运行时错误,就像您通过强制展开一个具有nil
值的普通可选项一样
当可选项的值为
在第一次定义可选项后立即确认存在,并且
可以肯定地假设在此后的每一点上都存在
var a:String
是我们称之为隐式展开的可选项。它是一个可选选项,可以保存nil
的值,但编译器不会产生任何与此相关的编译时错误
如果它有一个nil值,并且被使用,您将得到一个运行时错误,就像您通过强制展开一个具有nil
值的普通可选项一样
当可选项的值为
在第一次定义可选项后立即确认存在,并且
可以肯定地假设在此后的每一点上都存在
请阅读《Swift语言指南》中关于
隐式展开选项的章节
:请阅读《Swift语言指南》中关于隐式展开选项的章节
:因此,这对(比如)我知道在使用类或结构之前要在某个时候初始化的变量属性是有好处的,对吗?但是为什么之后我可以将它们设置为nil
?这肯定违反了他们“在此后的每一点上都存在”的假设。我希望运行时会阻止我这样做。我不知道为什么不存在这样的限制。你只能希望与你一起工作的每一个人都知道如何处理他们,并且他们不会打破传统。但是,如果这样的事情让你感到不安,最安全的方法是使用一个普通的可选选项,再加上一个if let
语句来安全地打开它。是的,我认为我的问题其实是如何声明属性,而不是如何展开可选项。所以,这对,比如说,一个类或结构的变量属性很好,我知道在使用它们之前,我会在某个时候初始化它们,对吗?但是为什么之后我可以将它们设置为nil
?这肯定违反了他们“在此后的每一点上都存在”的假设。我希望运行时会阻止我这样做。我不知道为什么不存在这样的限制。你只能希望与你一起工作的每一个人都知道如何处理他们,并且他们不会打破传统。但是,如果这样的事情让你感到不安,最安全的方法是使用一个普通的可选选项,再加上一个if let
语句来安全地打开它。是的,我认为我的问题其实是如何声明属性,而不是如何展开选项。