Swift Tips: Variable used within its own initial value

在某些情况下,我们希望能够在一个函数传入的函数中调用这个函数的返回值。举个例子,UIApplication 有一个成员函数:

func beginBackgroundTask(  
    expirationHandler handler: () -> Void? = nil)
        -> UIBackgroundTaskIdentifier

beginBackgroundTask(expirationHandler:) 返回一个数字(UIBackgroundTaskIdentifier 实际上是 Int),在 expirationHandler: 中我们需要使用这个数字 —— 在这个函数中,我们希望使用它的返回值。

第一次简单的尝试:

let bti = UIApplication.shared.beginBackgroundTask {  
    UIApplication.shared.endBackgroundTask(bti)
} // error: variable used within its own initial value

Swift 的安全检查在编译时报错:在声明变量的表达式中无法使用这个变量。

那么我们先声明这个变量,再给他赋值:

var bti: UIBackgroundTaskIdentifier  
bti = UIApplication.shared.beginBackgroundTask {  
    UIApplication.shared.endBackgroundTask(bti)
} // error: variable captured by a closure before being initialized

Swift 再次报错,未赋值的变量不能被 Block 捕获。

所以我们只能先声明这个变量,给他赋值,再使用:

var bti: UIBackgroundTaskIdentifier = 0  
bti = UIApplication.shared.beginBackgroundTask {  
    UIApplication.shared.endBackgroundTask(bti)
} 

或者使用一个稍微 Clean 一些的方法:

var bti: UIBackgroundTaskIdentifier? = nil  
bti = UIApplication.shared.beginBackgroundTask {  
    UIApplication.shared.endBackgroundTask(bti!)
} 

However, 既然我们使用了 var 而不是 let
Olive Kitteridge, EP4

参考:IOS 11 Programming Fundamentals with Swift: Swift, Xcode, and Cocoa Basics by Matt Neuburg