在将Objective-C代码移植到Swift时,我遇到过几次这个问题。说我有以下代码:
dispatch_async(dispatch_get_main_queue()) {
self.hostViewController?.view.addSubview(self.commandField)
}
这将导致错误,强调整个dispatch_async
来电,提供:
Could not find member 'addSubview'
我认为这是一个尚未正确实现的错误,因为如果我将addSubview
调用放在dispatch_async
块之外,那么项目构建正常。最初我认为它可能与在块中捕获self
有关。但是,插入[unowned self] in
会导致相同的错误,[weak self] in
也会导致相同的错误(在插入相应的!
展开运算符之后)。
如何让dispatch_async
块在Swift中工作,需要捕获self
?
答案 0 :(得分:65)
你应该在非无效性上对这个动作进行分解,而不是在你已经启动它之后对其进行测试:
if let hostView = self.hostViewController?.view {
DispatchQueue.main.async {
hostView.addSubview(self.commandField)
}
} else {
// handle nil hostView
}
你永远不应该打开if let
之外的可选项,或者先测试它。这样做也应该解决你自己的弱问题。
答案 1 :(得分:12)
dispatch_async
语法随Swift 3而改变:
DispatchQueue.main.async {
hostView.addSubview(self.commandField)
}