ios - protocol - swift プロトコル とは
Swift 5.0コンパイラを使用するXcode 10.2-プロトコル継承の問題 (2)
現在のXcodeバージョン(10.2)には大きな問題があります。
次のシグネチャを持つ
BasicViewController
クラスがあります。
class BasicViewController: UIViewController, UITableViewDataSource, UITableViewDelegate
それから、
ExampleViewController: BasicViewController
ような追加のロジックを持つクラスがもう1つあります。
今トリッキーな部分が来ます...
私たちはさまざまなシミュレータやデバイス上でアプリを構築して実行していますが、すべてうまく機能しています。
それから我々はアプリをアーカイブし、突然
didSelectRow
はもう解雇されません。
プロジェクトを徹底的にクリーンにすることで、再度アーカイブすることなく問題を再現することができました。
これが起こる可能性があるとき、私はどんな場合も考えることができません。
アーカイブされたアプリを実行しているときだけ
UITableViewDelegate
メソッドが子クラスで呼び出されないという同様の問題が見つかったため、さらに悪化しました。
アーカイブやアプリの送信中に、いくつかの最適化に問題があるのでしょうか。
テーブルの
dataSource
と
delegate
を正しく設定したことを確認します。テーブル上にジェスチャ認識機能はありません。
2回目から3回目までアプリを実行した後も同じロジックがうまく機能しますが、プロジェクトが完全にクリーンアップされた後に初めて失敗します。
テストを行い、
UITableViewDataSource
と
UITableViewDelegate
を子クラスに設定した後、毎回期待どおりに機能します。
プロトコルの継承はうまくいかないようです。
プロトコルを親に保持し、それらを子クラスに追加した場合、子クラスのプロトコルは冗長であると言えます。
誰かが似たようなことを経験したことがありますか? 任意の提案は大歓迎です。
Swift 5.0コンパイラの https://bugs.swift.org/browse/SR-10257 しているかもしれません。 これは、少なくとも3つのファイルがあると起こります。
-
BasicViewController.swift
-
SomeOtherFile.swift
-
ExampleViewController.swift
SomeOtherFile.swift
が
AnyObject
型の値を呼び出す場合、
wholemodule
モードでコンパイルしていて、ファイルが上記の順序で(
SomeOtherFile.swift
が2つの中間にある)コンパイラに渡されると、コンパイラは、
func tableView(_:, didSelectRowAt:)
実装に対して
@objc
-nessを正しく推論できないことに
@objc
。
@objc
では
@objc
で明示的にタグ付けすることで
@objc
ます。
データビューをアタッチし、
Storyboard
とClassを使用して両側を
delegate
する必要があります。これは、一度tableviewで同じ問題が発生し、それがクラス内で発生したためではありません。
self.tableView.delegate = self
self.tableView.datasource = self
私はあなたがこのようにやっていないと思います。
両方のスタイルを使用する必要はないことを私は知っていますが、いつかこれが必要になります。 この答えを見てみましょう https://.com/a/39443079/3485420