是什么这些声明,其中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!
它编译时。