了解可选类型

时间:2015-12-29 08:27:40

标签: swift

ScheduleFetcher是一个类

的这些声明之间有什么区别

var fetcher: ScheduleFetcher?

var fetcher: ScheduleFetcher!

两者似乎都声明了一个可选类型。有什么不同吗?

2 个答案:

答案 0 :(得分:1)

这两个值都可以是nil

第二个被称为“隐式解包”可选。因为如果fetcher.doSomething() fetchernilfetcher?.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!

当然,如果abnil,则会发生运行时错误。因为你强迫它打开nil可选项。

另一方面,如果您使用Int!代替Int?来声明变量,

var sum = a + b

有效!这是因为无论何时使用声明为隐式展开类型的变量(即XXX!),都会在变量后隐式放置!。所以上面的陈述实际上是:

var sum = a! + b!

编译时。