ios - Xcode 10.2 mit Swift 5.0 Compiler-Protokollvererbungsproblem




protocols (2)

Ich bin auf dasselbe Problem gestoßen. Ich habe es behoben, indem ich die Methoden direkt in meine Hauptklasse eingefügt und sie in den anderen Klassen überschrieben habe. Jetzt wird alles korrekt aufgerufen.

Wir haben ein großes Problem mit der aktuellen Xcode-Version (10.2).

Es gibt eine BasicViewController Klasse mit der folgenden Signatur:

class BasicViewController: UIViewController, UITableViewDataSource, UITableViewDelegate

Dann haben wir eine andere Klasse wie ExampleViewController: BasicViewController die einige zusätzliche Logik hat.

Jetzt kommt der knifflige Teil ...

Wir bauen und betreiben die App auf verschiedenen Simulatoren und Geräten und alles funktioniert einwandfrei. Dann archivieren wir die App und didSelectRow wird plötzlich nicht mehr abgefeuert. Dank Deep Clean und Clean des Projekts konnten wir das Problem reproduzieren, ohne es erneut archivieren zu müssen.

Ich kann mir keinen Fall vorstellen, in dem dies passieren könnte. Und es wird noch schlimmer, da ich mehr ähnliche Probleme mit UITableViewDelegate Methoden fand, die nicht nur beim Ausführen der archivierten App in der UITableViewDelegate Klasse aufgerufen wurden. Könnte es ein Problem mit einigen Optimierungen während des Archivierens und Einreichens der App sein?

Ich überprüfe, ob wir die dataSource und den delegate der Tabelle ordnungsgemäß festgelegt haben. Es gibt keine Gestenerkenner für die Tabelle. Dieselbe Logik funktioniert auch nach dem zweiten / dritten Ausführen der App, schlägt jedoch beim ersten Mal nach einer gründlichen Projektbereinigung fehl.

Wir haben einen Test durchgeführt und UITableViewDataSource und UITableViewDelegate in der UITableViewDelegate Klasse festgelegt, und dann funktioniert es jedes Mal wie erwartet. Es scheint, als würde die Vererbung der Protokolle nicht gut funktionieren. Wenn wir die Protokolle in der übergeordneten Klasse behalten und sie auch in der untergeordneten Klasse hinzufügen, heißt es, dass die Protokolle in der untergeordneten Klasse redundant sind.

Hat jemand etwas ähnliches erlebt? Anregungen sind willkommen.


Möglicherweise wird https://bugs.swift.org/browse/SR-10257 im Swift 5.0-Compiler ausgeführt. Dies würde passieren, wenn Sie mindestens drei Dateien haben:

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

Wenn SomeOtherFile.swift einen AnyObject Typ AnyObject aufruft, kompilieren Sie im wholemodule , und die Dateien werden in der obigen Reihenfolge an den Compiler übergeben (mit SomeOtherFile.swift in der Mitte der beiden) dass der Compiler @objc für die Implementierung von func tableView(_:, didSelectRowAt:) nicht richtig func tableView(_:, didSelectRowAt:) . Sie können das @objc indem Sie es @objc explizit mit @objc .





protocols