【问题标题】:Difference between optional and forced unwrapping [duplicate]可选和强制展开之间的区别[重复]
【发布时间】:2015-02-23 00:46:45
【问题描述】:
下面是变量名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!)")
}
【问题讨论】:
标签:
swift
optional
forced-unwrapping
【解决方案1】:
字符串?是正常的可选。它可以包含 String 或 nil。
字符串!是一个隐式展开的可选项,您表明它总是有一个值 - 在它被初始化之后。
你的名字是可选的,你的名字2!不是。
您的第一个打印语句将输出类似“Your name is Optional("Paula")”
您的第二个打印语句将输出类似“您的名字是约翰”的内容。如果您从语句中删除感叹号,它将打印相同的内容。
顺便说一句,Swift 文档在 iBooks 上作为“Swift 编程语言”免费提供,最新的也是 online here。
【解决方案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
一般来说,如果您在初始化时不为变量赋值,则应始终使用可选项。它将减少由于程序员错误导致的程序崩溃,并使您的代码更安全。
【解决方案3】:
强制解包一个可选项,向编译器发送消息,表明您确定该可选项不会为 nil。但是如果它是零,那么它会抛出错误:
致命错误:在展开 Optional 值时意外发现 nil。
解开可选项的更好方法是可选绑定。 if-let 语句用于可选绑定:首先将可选分配给非可选类型的任意常量。该分配仅在 optional 具有值时才有效并且有效。如果可选项为 nil,则可以使用 else 子句。