无需在Swift中解包选项?

我认为我对“展开”可选值的概念感到困惑,任何指导都会非常感激!

根据Swift编程语言指南,可选项需要在可以使用之前解包,除非使用!隐式解包。

来自:Apple Inc.“The Swift Programming Language。”iBooks。 https://itun.es/gb/jEUH0.l :

let possibleString: String? = "An optional string." println(possibleString!) // requires an exclamation mark to access its value 

 let assumedString: String! = "An implicitly unwrapped optional string." println(assumedString) // no exclamation mark is needed to access its value 

但是,在Xcode中,我可以执行以下操作并仍然打印可选字符串的值:

 let teamname: String? = "Liverpool!" println("Come on \(teamname)") 

我错过了什么?

可选项需要解包,但您并不总是需要自己进行解包。

 var teamname: String? = "Liverpool" println("Come on \(teamname)") 

在这种情况下,字符串插值将检查可选,然后解包并将其值添加到String。 如果Optional为nil,则会向String添加“nil”。

要访问String的属性和方法,您必须显式解包它。 如果您不知道它是否为零,则应使用if语句进行检查。

 if teamname != nil { var newName = teamname!.capitalizedString } 

首先,一个可选项只需要在不允许可选的地方使用它时才需要解包。 (例如,将String?分配给String

 var optionalString: String? = "Some string" var absolutelyAString: String = "Another string" // absolutelyAString = optionalString // Error. Needs to unwrap absolutelyAString = optionalString! // OK. 

“展开”基本上意味着“保证价值不是零”。 只需将其视为非可空类型的转换。

其次, println()接受选项很好但是因为它会为你检查你的变量。 如果变量的值为nil ,则打印“nil”; 否则它会打印StreamablePrintableDebugPrintable协议实现的字符串。