我正在学习斯威夫特,我对隐含的无包装选项有疑问 .
我有一个函数返回一个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 无法解包:结果窗格和控制台都显示打印值为Optional("404")且找到了Apartment:可选("404"),并且为了让404出现在控制台上我必须使用!符号,如果我理解正确,只需手动打开常规选项 .
为什么会这样?
我的猜测是,当传递给println()时, apt 被隐式地从Implicitly Unwrapped Optional转换为常规Optional,这会导致出现Optional("404")文本,但我只是一个语言的初学者 .
1 回答
let apt :String! = findApt("404")
将不会解包可选,因为您明确使用了String!
的可选类型如果要打开可选用途:
或更好,使用类型推断:
这就是控制台/游乐场显示值的方式 . 在您的代码示例中,
apt
仍然是Optional
.您可以使用
dynamicType
在运行时检查类型,即println(apt.dynamicType)