2015-12-29 41 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! 

它编译时。