无需在Swift中解包选项?

时间:2014-06-04 14:34:24

标签: ios 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)")

我错过了什么?

2 个答案:

答案 0 :(得分:2)

可选项需要解包,但您不必总是自己动手。

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

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

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

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

答案 1 :(得分:2)

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

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

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

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