首页 文章

Implicitly Unwrapped Optionals和println

提问于
浏览
1

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

我有一个函数返回一个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 回答

  • 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)

相关问题