ScheduleFetcher
是一个类
var fetcher: ScheduleFetcher?
和
var fetcher: ScheduleFetcher!
两者似乎都声明了一个可选类型。有什么不同吗?
答案 0 :(得分:1)
这两个值都可以是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
,则只会致电{{1}}。
{{1}}
答案 1 :(得分:0)
具有?
的可选类型不能立即用作其非可选对应类型。您必须使用!
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!
编译时。