swift 中的可选值之间的差异?

Difference between optional values in swift?

有什么区别:

var title:String? = "Title" //1
var title:String! = "Title" //2
var title:String = "Title" //3

如果我以各种方式设置标题,我会被迫以不同的方式展开每个变量,我在说什么?

?! 想象成一个可能有值或没有值的盒子。

我推荐this article

  1. 可能有值或可能没有的可选框,并且该可选框未展开。

    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"
    }
    
  2. 可能有值或可能没有的可选框,并且该可选框实际上是展开的。如果有一个值并且你访问那个值,那没问题(second image,只需将 ? 替换为 !),但如果没有值,然后应用程序崩溃(第三张图片,只需将 ? 替换为 !

    var title:String! = "Title"
    
  3. 那个变量肯定有一个值,你不能给这个值赋值nil(因为它不是可选的)。 Optional表示有值或者没有值(nil):

    var title:String = "Title" //first picture
    

`var title:String? = "Title"`

title 目前的值为 Title,但将来可能是 nil。我将需要使用可选绑定来解包它:

if let unwrappedTitle = title {
   println(unwrappedTitle)
}

或者用 ! 字符强制解包

let unwrappedTitle = title!

如果 titlenil

,上面的代码会崩溃

`var title:String! = "Title"`

title 当前的值为 "Title"。它可能是零,但我知道当我使用它时它永远不会是。您不需要使用可选绑定或通过使用 ! 字符强制解包来解包。

如果在 nil 期间访问此值,您的程序将崩溃,但编译器会让您将此值设置为 nil

`var title:String = "Title"`

title 当前的值为 "Title"。这可能会改变,但变量 title 将始终具有一些字符串值。我不需要使用可选绑定或强制解包来检查 nil。如果您尝试将 title 设置为 nil.

,编译器将不允许您构建
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.