2015-12-29 43 views
-2

是什麼這些聲明,其中ScheduleFetcher是一類瞭解可選類型

var fetcher: ScheduleFetcher?

var fetcher: ScheduleFetcher!

兩者之間的區別似乎聲明一個可選的類型。有什麼區別嗎?

回答

1

這兩個值都可以是nil

第二個被稱爲「隱式解包」可選。因爲訪問它像fetcher.doSomething()隱含地解開它並崩潰,如果fetchernil

第一個要由你來解開明確或打電話fetcher?.doSomething()這隻會叫doSomething()如果fetchernil

let a : ScheduleFetcher? = nil 
let b : ScheduleFetcher! = nil 

a?.doSomething() // does nothing 
b.doSomething() // crahes 
a!.doSomething() // crashes as well 

a = ScheduleFetcher() 
b = ScheduleFetcher() 

a?.doSomething() // calls the method 
b.doSomething() // calls the method 
0

?的可選類型不能立即用作其非可選對象。你必須展開!

var a: Int? = 10 
var b: Int? = 20 
var sum = a + b //Invalid! 
var correctSum = a! + b! //Valid! 

當然,如果任abnil,發生運行時錯誤。因爲你迫使它打開nil可選。

在另一方面,如果你使用Int!而不是Int?聲明變量,

var sum = a + b 

是有效的!這是因爲無論何時使用聲明爲隱式展開類型的變量(即XXX!),隱含地將!置於該變量之後。所以上面的語句實際上是:

var sum = a! + b! 

它編譯時。