0

下面是变量名 yourname 和 yourname2 的可选字符串的代码。

实际上,它们之间有什么区别以及在 yourname2 的情况下如何强制展开

var yourname:String?
yourname = "Paula"
if yourname != nil {
    println("Your name is \(yourname)")
}

var yourname2:String!
yourname2 = "John"
if yourname2 != nil {
    println("Your name is \(yourname2!)")
}
4

3 回答 3

2

您所说的“强制展开”被称为“隐式展开的可选”。隐式展开的可选项通常用于在初始化期间不能或不会将值分配给属性的对象,但可以预期在使用时总是返回非零值。使用隐式展开的可选项会降低代码安全性,因为在运行前无法检查其值,但允许您在每次使用属性时跳过展开属性。例如:

 var a: Int!
 var b: Int?

 var c = a + b //won't compile
 var d = a + b! //will compile, but will throw an error during runtime
 var e = a + a //will compile, but will throw an error during runtime

 a = 1
 b = 2

 var f = a + b //still won't compile
 var g = a + b! //will compile, won't throw an error
 var h = a + a //will compile, won't throw an error

一般来说,如果您在初始化时未为变量赋值,则应始终使用可选项。它将减少由于程序员错误导致的程序崩溃,并使您的代码更安全。

于 2015-02-23T01:13:47.257 回答
2

字符串?是正常的可选。它可以包含 String 或 nil。

弦!是一个隐式展开的可选选项,您在其中表明它总是有一个值 - 在它被初始化之后。

在你的情况下你的名字是一个可选的,你的名字2!不是。你的第一个打印语句将输出类似“你的名字是可选的(“保拉”)”

您的第二个打印语句将输出类似“你的名字是约翰”的内容。如果您从语句中删除感叹号,它将打印相同的内容。

顺便说一句,Swift 文档在 iBooks 上以“The Swift Programming Language”的形式免费提供,最新的文档也在此处在线

于 2015-02-23T01:14:32.840 回答
0

强制解包一个可选项,向编译器提供您确定该可选项不会为 nil 的消息。但是如果它是 nil,那么它会抛出错误:致命错误:在展开 Optional 值时意外发现 nil。

解开可选项的更好方法是使用可选项绑定if-let语句用于可选绑定:首先将可选分配给非可选类型的任意常量。该分配仅在 optional 具有值时才有效并且有效。如果可选项为 nil,则可以使用 else 子句进行。

于 2017-09-11T09:04:56.183 回答