Gemischter Sprachrahmen

8

Ich habe ein Framework (nennen wir es MyKit) in Objective-C geschrieben, das ich mit einigen Swift-Klassen erweitere. Ich versuche, es mit dieser Dokumentation zu verstehen: Ссылка

Soweit ich es verstehe, sollte ich keine Bridging-Header-Klasse haben und stattdessen alle meine Includes in die Schirm-Header-Datei (die ich verstanden habe) einfügen.

Also schreibe ich in MyKit.h:

%Vor%

Ich listet ControllerObjectD.swift nicht auf, obwohl es auch hier geht? Oder sollte ich

einschließen %Vor%

?

ControllerObjectD verwendet ModelObjectA und ModelObjectB. Jetzt, da ich keine Bridge-Headerdatei habe, bekomme ich Kompilierfehler, weil diese Objekte nicht gefunden werden können.

In der Dokumentation heißt es: "Swift sieht alle Header, die Sie öffentlich in Ihrer Kopfzeile anzeigen." und das ist wahr, wenn ich das Framework in andere Projekte importiere, aber das Framework-Projekt kann nicht kompilieren, weil es es nicht sieht. Ich habe die Build-Einstellung "Module definieren" aktiviert.

Gibt es etwas, das ich vielleicht über den Regenschirmkopf missverstanden habe? Wo kann ich "Hallo Projekt, das ist die Regenschirm-Header-Datei" sagen? Das Framework kompiliert, wenn ich die Umbrella-Header-Datei als Bridging-Header setze, aber das klingt, als wäre ich auf diese Weise zum Anfang zurückgekehrt?

Prost

Nik

    
niklassaers 27.02.2015, 08:56
quelle

3 Antworten

25

Ich glaube, dass Ihr Problem auf die Access Modifiers in Ihrer Swift Klasse zurückzuführen ist, aber ich habe eine kurze Anleitung und ein Beispielprojekt geschrieben, um Ihnen zu helfen:

Beispielprojekt finden Sie hier

Es gibt zwei Teile eines gemischten Sprachrahmens:

  1. Importieren von Objective-C in Swift
  2. Importieren von Swift in Objective-C

1. Objective-C in Swift importieren

Dies ist beispielsweise der Fall, wenn Sie eine Objective-C-Klasse mit dem Namen Player haben, die Sie einer schnellen Klasse namens Game hinzufügen möchten.

Gemäß der Dokumentation müssen Sie diese beiden Schritte ausführen, um das Objekt Player in das Objekt Game zu importieren.

  1. Stellen Sie unter Buildeinstellungen unter Verpackung sicher, dass die Einstellung Defines Modul für dieses Framework-Ziel auf Ja festgelegt ist.

  1. Importieren Sie in Ihrer Umbrella-Header-Datei alle Objective-C-Header, die Sie Swift zur Verfügung stellen möchten.

    %Vor%

Stellen Sie sicher, dass Ihre Header-Datei Player in Objective-C für die öffentliche Zielmitgliedschaft im Framework markiert ist:

Nach diesen Schritten ist es möglich, die Klasse Player Objective-C in die Klasse Game Swift Class:

zu importieren %Vor%

2. Importieren von Swift in Objective-C

Um die Klasse Swift Game in das Objekt Player zu importieren, können wir eine ähnliche Prozedur ausführen.

  1. Wie zuvor; Stellen Sie unter Buildeinstellungen unter Verpackung sicher, dass die Einstellung Defines Modul für dieses Frameworkziel auf Ja festgelegt ist.

  1. Importieren Sie den Swift-Code aus diesem Framework-Ziel in eine Objective-C .m-Datei innerhalb dieses Framework-Ziels, indem Sie diese Syntax verwenden und die entsprechenden Namen ersetzen:

    %Vor%

    In meinem Fall funktioniert das wie folgt:

    %Vor%

    und ich nehme an, für Sie:

    %Vor%

    Stellen Sie daher sicher, dass alle Eigenschaften, Methoden und Klassen, auf die Sie zugreifen möchten, in Ihrer swift-Datei als öffentlich definiert sind, da sie sonst für Objective-C nicht sichtbar sind.

Ich habe mein Beispielprojekt hochgeladen, das zeigt, wie dies auf GitHub Ссылка

funktioniert

Ich hoffe, das hilft dir bei deinem Problem.

    
Elliott Minns 27.02.2015, 10:32
quelle
1

Ich denke, Sie müssen bridging-header tun, um auf Ihren obj-c-Code in swift zuzugreifen. Mehr in der Verbindung Ссылка

also ist es eine Datei mit Ihren Importen von obj-c, die auf swift übertragen werden. Namen sind sehr wichtig, also kümmern Sie sich darum. hoffe es hilft

ps. Außerdem müssen Sie diesen Header-Pfad zu Ihren Projekteinstellungen hinzufügen

    
Pavel Zagorskyy 27.02.2015 09:17
quelle
1

Aus der Dokumentation von Apple: Eine Swift-Klasse muss ein Nachkomme einer Objective-C-Klasse sein, um in Objective-C zugänglich und verwendbar zu sein. Weitere Informationen darüber, worauf Sie von Objective-C zugreifen können und wie die Swift-Schnittstelle importiert wird, finden Sie unter Swift-Typ-Kompatibilität.

Also muss Ihre öffentliche Swift-Klasse NSObject zum Beispiel erweitern.

    
Johan Velthuis 15.08.2016 14:47
quelle

Tags und Links