2016-10-20 10 views
0

Nach dem Konvertieren in Swift 3 habe ich Probleme mit Sichtbarkeit von Obj-C (Interface Builder kann die Controller-Klasse zur Laufzeit nicht finden). So habe ich @objc zu debuggen:Swift 3: Xcode behauptet, dass eine generische Klasse generisch ist

@objc(ASSitesTableViewController) 
class ASSitesTableViewController : GenericFRCTableVC<Site> 

Und Xcode spuckt zurück:

Generisches Unterklassen von ‚@objc‘ Klassen können keine explizite haben ‚@objc‘ Attribut, weil sie nicht direkt sichtbar sind Objective -C

Aber die Klasse ist nicht wirklich generisch. Es erbt nur von einer Klasse, die spezialisiert wurde.

Ich bin mir bewusst, dass Unterklasse eine spezialisierte Art ist eine lange Geschichte, da es in früheren Versionen von Swift nicht unterstützt wurde, aber es kompiliert ohne Beschwerden. Ich habe nicht erwartet, dass meine Klasse bleibt generisch.

Ich fand keine Erwähnung von Generika im Vererbungsabschnitt der Swift-Dokumente oder umgekehrt.

Muss die Basisklasse nicht-generisch sein, damit die Unterklasse für Obj-C sichtbar ist?

Antwort

2

Muss die Basisklasse nicht-generisch sein, damit die Unterklasse für Obj-C sichtbar ist?

Ja. Die Unterklasse hat selbst keinen generischen Platzhalter in ihrer Definition, aber eine Unterklasse "ist" ihre Oberklasse. Ein Hund "ist" ein Vierfüßler (wenn Hund eine Unterklasse von Vierfüßler ist). Also diese Klasse "ist" eine GenericFRCTableVC<Site>. Nun, Objective-C kann keinen Sinn von GenericFRCTableVC<Site> machen, so dass es keinen Sinn für einen ASSitesTableViewController geben kann.

Nach 3

zu Swift Umwandlung ich glaube, Sie Sie das gleiche Problem in einer früheren Version von Swift gehabt hätte finden. Ich glaube nicht, dass dies etwas mit der Umstellung auf Swift 3 zu tun hat.

+0

Danke für die Bestätigung. Das größere Problem entstand aufgrund von Swift 3, da der FRC (Holed Results Controller) in dieser Version generisch gemacht wurde, die ich erfolglos versuchte, die Kette entlang zu verbreiten. – Andreas

+0

Ich weiß - ich hatte eine Reihe von Schwierigkeiten mit den neuen importierten Generika. Beachten Sie jedoch, dass importierte Generika _kovariant_ im parametrisierten Typ sind. Das kann in vielen Situationen helfen. – matt

+0

Alle von ihnen? Klingt eher nach Sicherheit als nach einer Funktion, aber ich konnte keine Dokumentation dieses Verhaltens finden. Ich denke, gewöhnliche Arrays verhielten sich auch so bis Swift 2. https://youtu.be/n9yAJfYjcl4?t=39m6s – Andreas

Verwandte Themen