我正在学习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”)文本出现,但我想就这一问题提供一些专家建议,因为我只是该语言的初学者。
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