ios - protocol - swift プロトコル とは




Swift 5.0コンパイラを使用するXcode 10.2-プロトコル継承の問題 (2)

Swift 5.0コンパイラの https://bugs.swift.org/browse/SR-10257 しているかもしれません。 これは、少なくとも3つのファイルがあると起こります。

  1. BasicViewController.swift
  2. SomeOtherFile.swift
  3. ExampleViewController.swift

SomeOtherFile.swiftAnyObject 型の値を呼び出す場合、 wholemodule モードでコンパイルしていて、ファイルが上記の順序で( SomeOtherFile.swift が2つの中間にある)コンパイラに渡されると、コンパイラは、 func tableView(_:, didSelectRowAt:) 実装に対して @objc -nessを正しく推論できないことに @objc@objc では @objc で明示的にタグ付けすることで @objc ます。

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

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

class BasicViewController: UIViewController, UITableViewDataSource, UITableViewDelegate

それから、 ExampleViewController: BasicViewController ような追加のロジックを持つクラスがもう1つあります。

今トリッキーな部分が来ます...

私たちはさまざまなシミュレータやデバイス上でアプリを構築して実行していますが、すべてうまく機能しています。 それから我々はアプリをアーカイブし、突然 didSelectRow はもう解雇されません。 プロジェクトを徹底的にクリーンにすることで、再度アーカイブすることなく問題を再現することができました。

これが起こる可能性があるとき、私はどんな場合も考えることができません。 アーカイブされたアプリを実行しているときだけ UITableViewDelegate メソッドが子クラスで呼び出されないという同様の問題が見つかったため、さらに悪化しました。 アーカイブやアプリの送信中に、いくつかの最適化に問題があるのでしょうか。

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

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

誰かが似たようなことを経験したことがありますか? 任意の提案は大歓迎です。


データビューをアタッチし、 Storyboard とClassを使用して両側を delegate する必要があります。これは、一度tableviewで同じ問題が発生し、それがクラス内で発生したためではありません。

self.tableView.delegate = self
self.tableView.datasource = self

私はあなたがこのようにやっていないと思います。

両方のスタイルを使用する必要はないことを私は知っていますが、いつかこれが必要になります。 この答えを見てみましょう https://.com/a/39443079/3485420





protocols