自己でdispatch_asyncを使用する 質問する

自己でdispatch_asyncを使用する 質問する

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、事前にテストしたりしないでください。これを行うと、弱い自己の問題も解決されるはずです。

おすすめ記事