web-dev-qa-db-fra.com

Xcode 10.2 avec Swift 5.0 - problème d'héritage de protocole

Nous avons un gros problème avec la version actuelle de Xcode (10.2).

Il existe une classe BasicViewController avec la signature suivante:

class BasicViewController: UIViewController, UITableViewDataSource, UITableViewDelegate

Ensuite, nous avons une autre classe comme ExampleViewController: BasicViewController qui a une logique supplémentaire.

Vient maintenant la partie délicate ...

Nous construisons et exécutons l'application sur différents simulateurs et appareils et tout fonctionne correctement. Ensuite, nous archivons l'application et soudainement didSelectRow n'est plus lancé. Un nettoyage en profondeur du projet nous a permis de reproduire le problème sans avoir besoin d'archiver à nouveau.

Je ne peux penser à aucun cas où cela pourrait se produire. Et cela devient encore pire, car j'ai trouvé des problèmes plus similaires avec les méthodes UITableViewDelegate qui n'étaient pas appelées dans la classe enfant uniquement lors de l'exécution de l'application archivée. Cela pourrait-il être un problème avec certaines des optimisations lors de l'archivage et de la soumission de l'application?

Je vérifie que nous avons correctement défini les dataSource et delegate de la table, il n'y a pas de reconnaissance de gestes sur la table. La même logique fonctionne bien après l'exécution de l'application deuxième/troisième fois, mais échoue la première fois après un nettoyage en profondeur du projet.

Nous avons fait un test et défini les UITableViewDataSource et UITableViewDelegate dans la classe enfant, puis cela fonctionne comme prévu à chaque fois. Il semble que l'héritage des protocoles ne fonctionne pas bien. Si nous conservons les protocoles dans le parent et les ajoutons également dans la classe enfant, cela indique que les protocoles de la classe enfant sont redondants.

Quelqu'un a-t-il vécu quelque chose de similaire? Toutes suggestions sont les bienvenues.

22
o15a3d4l11s2

Vous pouvez rencontrer https://bugs.Swift.org/browse/SR-10257 dans le compilateur Swift 5.0. Cela se produira si vous avez au moins trois fichiers:

  1. BasicViewController.Swift
  2. SomeOtherFile.Swift
  3. ExampleViewController.Swift

Si SomeOtherFile.Swift Fait des appels à une valeur de type AnyObject-, vous compilez en mode wholemodule et les fichiers sont passés au compilateur dans l'ordre ci-dessus (avec SomeOtherFile.Swift Au milieu des deux), il semble que le compilateur ne parvienne pas à déduire correctement @objc - ness pour l'implémentation de func tableView(_:, didSelectRowAt:). Vous pouvez contourner ce problème en le marquant explicitement avec @objc Pour l'instant.

15
BJ Homer

Je suis tombé sur le même problème. Je l'ai corrigé en ajoutant les méthodes directement dans ma classe principale, et override les dans les autres classes. Maintenant, tout est appelé correctement.

2
J. Doe