可选和强制展开之间的区别
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 子句进行处理。
下面是变量名 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 子句进行处理。