Erben von einem Swift-Klasse in Objective C
Ich bin erfolgreich mischen und anpassen von Obj-C und Swift in Xcode 7-Projekt. Jedoch kann ich nicht scheinen, um herauszufinden, wie, in eine Objective-C-Klasse zu Erben von einem Swift-Klasse (und ja ich weiß, zu deklarieren, dass die Swift-Klasse als @objc
für die Sichtbarkeit). In diesem Fall wird die gewünschte Swift-Oberklasse MySwiftViewController
ist eine Unterklasse von UIViewController
. Denn jetzt, in Obj-C, ich bin erbt direkt von UIViewController
und keinen Zugang zu den Funktionen, die ich Hinzugefügt MySwiftViewController
.
Hier ist, was ich verstehen:
-- Zu deklarieren Obj-C-Klasse als Erben von etwas, das in der .h-Datei, das nach dem ':':
#import <UIKit/UIKit.h>
@interface RootViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
@end
-- Um Swift Klassen sichtbar sind, die #import
ed:
#import "MyProject-Swift.h"
Jedoch, Sie können nicht importieren Sie die Swift-auto-generated-bridging-header in der Obj-C .h - Datei. Sie können auch nicht vorwärts-deklarieren eine undurchsichtige Oberklasse mit @class
. Also, ist das möglich und wie?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Leider ist es nicht möglich, eine Unterklasse eines Swift-Klasse in Objective-C. Direkt aus der docs:
Finden Sie in den Apple Handbuch für die Interoperabilität für mehr details auf, was Sie können und kann nicht auf mit Objective-C.
Als für Xcode 8.0 und früheren Versionen gibt es dirty-hacky Lösung, das wird wohl in der Zukunft gelöst werden.
Wenn Sie möchten, um eine Unterklasse von swift-Datei, die Sie hinzufügen können
objc_subclassing_restricted
Attribut. Sie können es als makro für die Bequemlichkeit.Code:
Swift Klasse.
Objc Klasse:
Aber, so wie ich das verstehe, ist es nicht unterstützt, und Sie müssen möglicherweise irgendeine Art von Fehler, weil es. Es ist also keine Anleitung zum handeln, und mehr wie gespannt was zu wissen.
[[ObjcClass alloc] init] say]
druckt "oops" ohne Fehler.@implementation
Zeile (ohne die Attribut,, bekomme ich jetzt schon auf die@interface
line)