web-dev-qa-db-ja.com

Xcode 10.2 with Swift 5.0コンパイラ-プロトコル継承の問題

現在のXcodeバージョン(10.2)には大きな問題があります。

次のシグネチャを持つBasicViewControllerクラスがあります。

class BasicViewController: UIViewController, UITableViewDataSource, UITableViewDelegate

次に、ExampleViewController: BasicViewControllerのような別のロジックが追加された別のクラスがあります。

トリッキーな部分がやって来ます...

私たちはさまざまなシミュレーターやデバイスでアプリをビルドして実行し、すべてが適切に動作します。その後、アプリをアーカイブすると、突然didSelectRowが起動しなくなります。プロジェクトの徹底的なクリーンアップにより、再度アーカイブする必要なしに問題を再現することができました。

これがいつ起こるかは、私には考えられません。さらに、アーカイブされたアプリを実行しているときにのみ、子クラスでUITableViewDelegateメソッドが呼び出されないという同様の問題を見つけたため、さらに悪化します。アプリのアーカイブと送信中の一部の最適化に問題がありますか?

テーブルのdataSourcedelegateが適切に設定されていることを確認しました。テーブル上にジェスチャー認識機能がありません。同じロジックは、アプリを2回/ 3回実行した後はうまく機能しますが、プロジェクトを深くクリーンアップした後は初めて失敗します。

テストを行い、UITableViewDataSourceUITableViewDelegateを子クラスに設定すると、毎回期待どおりに機能します。プロトコルを継承してもうまくいかないようです。プロトコルを親に保持し、子クラスにも追加すると、子クラスのプロトコルは冗長であると表示されます。

誰かが似たような経験をしましたか?どんな提案でも大歓迎です。

22
o15a3d4l11s2

Swift 5.0コンパイラで https://bugs.Swift.org/browse/SR-10257 を実行している可能性があります。これは、少なくとも3つのファイル:

  1. _BasicViewController.Swift_
  2. _SomeOtherFile.Swift_
  3. _ExampleViewController.Swift_

_SomeOtherFile.Swift_がAnyObject型の値を呼び出した場合、wholemoduleモードでコンパイルされ、ファイルは上記の順序でコンパイラに渡されます(_SomeOtherFile.Swift_は2つのうちの真ん中にあります)。その場合、コンパイラはfunc tableView(_:, didSelectRowAt:)の実装について_@objc_- nessを適切に推論できないようです。当面は、明示的に_@objc_でタグ付けすることで回避できます。

15
BJ Homer

同じ問題が発生しました。メインクラスに直接メソッドを追加して修正し、他のクラスではoverrideそれらを追加しました。これですべてが正しく呼び出されます。

2
J. Doe