Swift在同一条语句中传递方法结果到方法参数情况的处理

在相当稀罕的情况下,你想要将一个Cocoa方法的返回值立即传递给相同的方法里去使用.举个栗子,Cocoa有一个UIApplication实例方法:

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

beginBackgroundTask(expirationHandler:)返回一个数字(一个uibackgroundtaskIdentifier恰好是一个Int类型),随后将传递给expirationHandler:函数 —— 一个函数将会使用这个从外部返回的数字.Swift的安全规则不会让你声明这个数字变量然后在同一个语句中在一个匿名方法中使用它:

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

最终的解决方案是预先声明该变量并且赋予一个伪初始化值作为一个占位符:

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

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...