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
?
ベストアンサー1
このアクションを開始するには、すでに開始した後にテストするのではなく、null でないことを条件にする必要があります。
if let hostView = self.hostViewController?.view {
DispatchQueue.main.async {
hostView.addSubview(self.commandField)
}
} else {
// handle nil hostView
}
決して の外部でオプショナルをアンラップしたりif let
、事前にテストしたりしないでください。これを行うと、弱い自己の問題も解決されるはずです。