是什麼這些聲明,其中ScheduleFetcher
是一類瞭解可選類型
var fetcher: ScheduleFetcher?
和
var fetcher: ScheduleFetcher!
兩者之間的區別似乎聲明一個可選的類型。有什麼區別嗎?
是什麼這些聲明,其中ScheduleFetcher
是一類瞭解可選類型
var fetcher: ScheduleFetcher?
和
var fetcher: ScheduleFetcher!
兩者之間的區別似乎聲明一個可選的類型。有什麼區別嗎?
這兩個值都可以是nil
。
第二個被稱爲「隱式解包」可選。因爲訪問它像fetcher.doSomething()
隱含地解開它並崩潰,如果fetcher
是nil
。
第一個要由你來解開明確或打電話fetcher?.doSomething()
這隻會叫doSomething()
如果fetcher
不nil
。
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
帶?
的可選類型不能立即用作其非可選對象。你必須展開它!
var a: Int? = 10
var b: Int? = 20
var sum = a + b //Invalid!
var correctSum = a! + b! //Valid!
當然,如果任a
或b
是nil
,發生運行時錯誤。因爲你迫使它打開nil
可選。
在另一方面,如果你使用Int!
而不是Int?
聲明變量,
var sum = a + b
是有效的!這是因爲無論何時使用聲明爲隱式展開類型的變量(即XXX!
),隱含地將!
置於該變量之後。所以上面的語句實際上是:
var sum = a! + b!
它編譯時。