当前位置: 首页 > 知识库问答 >
问题:

隐式展开选项和println

左丘善
2023-03-14

我正在学习Swift,我对隐式展开选项有疑问。

我有一个返回字符串可选的函数

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没有展开:结果窗格和控制台都显示打印的值是可选的(“404”)和找到的公寓:可选(“404”),为了让404出现在控制台上,我必须使用!符号,如果我理解正确,它只需要手动展开常规选项。

为什么会这样?

我的猜测是,当传递到println()时,apt会隐式地从隐式未包装可选转换为常规可选,这会导致可选(“404”)文本出现,但我想就这一问题提供一些专家建议,因为我只是该语言的初学者。

共有1个答案

轩辕季同
2023-03-14

let apt:String!=findApt(“404”)不会打开可选的,因为您显式使用的是可选类型String

如果要打开可选的包装,请使用:

if let apt: String = findApt("404")
{
  ...
}

或者更好,使用类型推断:

if let apt = findApt("404")
{
  ...
}

在第一行中,apt按照应有的方式展开(结果窗格显示“404”),但在其他两行中,apt没有展开:结果窗格和控制台都显示打印的值是可选的(“404”)和找到的公寓:可选(“404”),为了让404出现在控制台上,我必须使用!符号,如果我理解正确,它只需要手动展开常规选项。

为什么会这样?

这就是控制台/游乐场显示值的方式。在您的代码示例中,apt仍然是一个可选的

您可以在运行时使用dynamicType,即println(apt.dynamicType)

 类似资料:
  • 一开始我对强制展开和隐式展开非常困惑。现在,以下是我自学的体会: 没有可用于隐式展开的操作,但有一种称为隐式展开选项的东西。隐式展开选项和普通选项都是选项,区别在于当访问隐式展开选项时,您可以自信地知道引擎盖下有一个有效值并可供使用。如果让绑定或强制展开()操作,普通选项需要

  • 如果像Apple在Swift编程中所说的隐式展开选项应该总是有一个值,那么为什么不使用非选项来代替呢?我知道非选项不能赋值为nil,但还有其他区别吗?

  • 在Swift 4.0中,以下代码不可编译: 现在我想象是

  • 在编写一个新的swift类时,当(不)使用隐式展开选项而不仅仅是普通选项时,我仍然不是100%舒服。据我所知,如果你从来没有期望它的值为零,那么把它指定为隐式未包装(可选)应该是可以的。如果为nil,则为异常事件,应导致运行时错误。 例如,这个简单的登录视图包含两个text field成员变量: 在上面的类中,emailField和passField都被归类为隐式展开选项,因为我从来没有期望它们在

  • 请原谅我的无知,我恐怕错过了一些基本的选项理解。我的印象是(隐式展开的可选指示符)保证该类型的变量不为零。然而,这个非常简单的Apple API很少会返回我。 这是一个意外的错误还是Optionals规范的一部分?因为如果这是规范的一部分,我不明白为什么会有选项,而不是变量可以存在或。

  • 例如,我有这样的类,而不是在方法中指定字段,我只想隐式地打开选项。 我理解这样做的原因是,当我声明它们时,它们的初始值为,因此我不需要,因为所有类的字段都有初始值。我所需要做的就是确保在尝试访问它们之前为它们分配了一些内容,否则会出现致命错误。 假设我们给这些字段赋值,现在我们用某种方法,我想问的是:为什么我们需要在一个条件函数中使用bool来强制展开它?我可以访问其他隐式展开的选项,甚至是boo