Implicitly Unwrapped Optionals和println

时间:2015-08-22 15:14:43

标签: swift optional swift-playground

我正在学习斯威夫特,我对隐含的无包装选项有疑问。

我有一个返回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" )要出现的文字,但我想就此事提供一些专家建议,因为我只是这个语言的初学者。

1 个答案:

答案 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)