我正在学习Swift,我对隐式取消包裹的可选选项有疑问。
我有一个返回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语句来执行安全的解包裹,它使用隐式解包裹可选作为其常量:
if let apt :String! = findApt("404")
{
apt
println(apt)
println("Apartment found: (apt)")
}
在第一行apt展开自己(结果窗格显示"404"),但在其他两行apt没有展开:结果窗格和控制台都显示打印的值是Optional("404")和Apartment found: Optional("404"),为了让404出现在控制台上,我必须使用!符号,如果我理解正确的话,它只需要手动展开常规的可选项。
为什么会发生?
我的猜测是,当传递给println()时,apt被隐式地从隐式解包可选转换为常规可选,这导致可选("404")文本出现,但我想要一些关于这件事的专家建议,因为我只是一个初学者的语言。
let apt :String! = findApt("404")
不会展开可选的,因为您显式地使用了可选类型String!
如果你想打开可选的,使用:
if let apt: String = findApt("404")
{
...
}
或者更好,使用类型推断:
if let apt = findApt("404")
{
...
}
在第一行中,apt自动展开(结果窗格)显示"404"),但在其他两行中apt没有展开结果窗格和控制台显示打印的值为可选("404")和公寓查找:可选("404"),并按顺序为404出现在控制台我必须使用!符号,如果我理解正确,只需要手动展开常规即可可选。
为什么会发生?
这就是控制台/游乐场显示值的方式。在您的代码示例中,apt
仍然是Optional
。
您可以在运行时使用dynamicType
检查类型,即println(apt.dynamicType)