我正在学习斯威夫特,我对隐含的无包装选项有疑问。
我有一个返回String的函数可选:
func findApt(aptNumber :String) -> String?
{
let aptNumbers = ["101", "202", "303", "404"]
for element in aptNumbers
{
if (element == aptNumber)
{
return aptNumber
}
} // END OF for LOOP
return nil
}
和执行安全展开的if语句,它使用Implicitly Unwrapped Optional作为其常量:
if let apt :String! = findApt("404")
{
apt
println(apt)
println("Apartment found: \(apt)")
}
在第一行 apt 自行展开(结果窗格显示" 404" ),但在另外两行 apt 无法解包:结果窗格和控制台都显示打印值为可选(" 404")和找到的公寓:可选( " 404"),并且为了让 404 出现在控制台上,我必须使用!符号,如果我理解正确,只需手动打开常规选项。
为什么会这样?
我的猜测是,当传递给println()时, apt 会从Implicitly Unwrapped Optional隐式转换为常规Optional,这会导致 Optional(" 404" )要出现的文字,但我想就此事提供一些专家建议,因为我只是这个语言的初学者。
答案 0 :(得分:2)
let apt :String! = findApt("404")
将不会打开可选项,因为您明确使用的是String!
如果要打开可选用途:
if let apt: String = findApt("404")
{
...
}
或更好,使用类型推断:
if let apt = findApt("404")
{
...
}
在第一行中,应该展开自己(结果窗格 显示“404”),但在另外两行apt不解包:两者 结果窗格和控制台显示打印值 可选(“404”)和公寓找到:可选(“404”),并为了 404出现在控制台我必须使用!符号,如果我 正确理解,只需手动打开常规 选配。
为什么会这样?
这就是控制台/游乐场显示值的方式。在您的代码示例中,apt
仍为Optional
。
您可以使用dynamicType
在运行时检查类型,即println(apt.dynamicType)