以下是变量名yourname和yourname2的可选字符串的代码。
实际上它们之间有什么区别,以及在你的名字2
的情况下如何强制展开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!)")
}
答案 0 :(得分: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
一般来说,如果您在初始化时没有为变量赋值,则应始终使用选项。它将减少程序员错误导致的程序崩溃,并使您的代码更安全。
答案 1 :(得分:2)
字符串?是正常可选的。它可以包含String或nil。
字符串!是一个隐式展开的可选项,您可以在其中指示它将始终具有值 - 在初始化之后。
你的案件中的你的名字是可选的,你的名字! ISN'吨。 你的第一个print语句将输出类似"你的名字是可选的(" Paula")"
你的第二个印刷语句将输出类似"你的名字是John"。如果从语句中删除感叹号,它将打印相同的内容。
顺便说一句,Swift文档可用作" Swift编程语言"在iBooks上免费,最新版本也是online here。
答案 2 :(得分:0)
强制解包一个可选项,向编译器发出一条消息,表明您确定该选项不会为nil。但如果它将为零,那么它会抛出错误: 致命错误:在展开Optional值时意外发现nil。
打开可选项的更好方法是可选绑定。 if-let 语句用于可选绑定:首先,可选项分配给非可选类型的任意常量。赋值仅有效,如果optional具有值,则有效。如果optional是nil,那么可以使用else子句继续。