可选和强制展开之间的区别

Difference between optional and forced unwrapping

下面是变量名 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!)")
}

你所说的 'forced unwrapping' 被称为 'implicitly unwrapped optional'。隐式展开的可选项通常用于在初始化期间不能或不会为 属性 赋值的对象,但在使用时可以预期总是 return 非零值。使用隐式解包的可选值会降低代码安全性,因为它的值无法在运行前检查,但允许您在每次使用 属性 时跳过解包。例如:

 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

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

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

字符串!是一个隐式展开的可选项,您可以在其中指示它将始终有一个值 - 在它被初始化之后。

你的名字是可选的,yourname2!不是。 您的第一个打印语句将输出类似 "Your name is Optional("Paula")"

的内容

您的第二个打印语句将输出类似 "Your name is John" 的内容。如果您从语句中删除感叹号,它将打印相同的内容。

顺便说一句,Swift 文档在 iBooks 上以 "The Swift Programming Language" 的形式免费提供,最新的也是 online here

强制解包 一个可选的,给编译器一个消息,你确定这个可选的不会是 nil。但如果它将为零,则会抛出错误: 致命错误:在展开可选值时意外发现 nil。

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