有什么区别:
var title:String? = "Title" //1
var title:String! = "Title" //2
var title:String = "Title" //3
如果我以各种方式设置标题并且我被迫以不同的方式展开每个变量,我该怎么说?
答案 0 :(得分:6)
将?
和!
视为可能具有值的框。
我建议this article。
可能具有值或可能不的可选框,并且未打开该可选框。
var title:String? = "Title" //second and third picture
你使用这样的展开值:
if let title = title {
//do sth with title, here is the same like let title: String = "Title"
}
可能具有值或可能不的可选框,并且该可选框实际上已解包。如果有值并且您访问该值,那就没关系(第二个图像,只需用?
替换!
),但如果没有值,则应用程序崩溃(第三张图片,只需将?
替换为!
)
var title:String! = "Title"
该变量肯定有值,您无法分配此值nil
(因为它不是可选的)。可选表示存在值或没有值(nil
):
var title:String = "Title" //first picture
答案 1 :(得分:2)
title
目前的值为Title
,但将来它可能是nil
。我需要使用可选绑定来解开它:
if let unwrappedTitle = title {
println(unwrappedTitle)
}
或强制使用!
字符展开
let unwrappedTitle = title!
如果title
为nil
title
目前的值为"Title"
。它可能是零,但我知道我使用它时永远不会。您不需要使用可选绑定或使用!
字符强制解包来解包它。
如果在nil
期间访问此值,您的程序将崩溃,但编译器会允许您将此值设置为nil
。
title
目前的值为"Title"
。这可能会改变,但变量title
将始终具有一些字符串值。我不需要使用可选绑定或强制解包来检查nil
。如果您尝试将title
设置为nil
,则编译器不会让您构建。
答案 2 :(得分:0)
var title:String? = "Title" //1 Nil Possible-Force Unwrap needed-Nil checking when use
var title1:String! = "Title"//2 Nil Possible-Force Unwrap not needed-Nil cheking when Use
var title2:String = "Title" //3 Nil Not possible as its initailize when declared-No force unwrap needed-No Nil Cheking is needed.