ios - tutorial - use swift class in objective c




Swift-Klassen in Objective-C können nicht verwendet werden (13)

@sig Antwort ist eine der besten, aber es hat nicht für mich mit dem alten Projekt (nicht neu!), Ich brauchte einige Änderungen. Nach vielen Variationen habe ich das Rezept für mich gefunden (mit XCode 7.2):

  1. Produktmodulname: $ (PRODUCT_NAME: c99extidentifier)
  2. Definiert Modul: NEIN
  3. Eingebetteter Inhalt enthält Swift: NO
  4. Installieren Sie Objective-C-Kompatibilitätsheader: JA
  5. Objective-C Bridging Header: Projektname-Bridging-Header.h

Der letzte Punkt (5) war entscheidend. Ich lege es nur auf den zweiten Abschnitt (Ziele Feld), das Projekt Feld sollte leer gelassen werden: Ansonsten hat es nicht die richtige "Project-Swift.h" -Datei für mich generiert (es enthielt keine schnellen Methoden).

Ich versuche Swift Code in meine App zu integrieren. Meine App ist in Objective-C und ich habe eine Swift Klasse hinzugefügt. Ich habe alles here beschrieben. Aber mein Problem ist, dass Xcode die Datei -Swift.h nicht erstellt -Swift.h , nur die Überbrückungs-Header. Also habe ich es erschaffen, aber es ist eigentlich leer. Ich kann alle meine ObjC Klassen in Swift verwenden, aber ich kann es nicht umgekehrt machen. Ich habe meine schnelle Klasse mit @objc markiert, aber es hat nicht geholfen. Was kann ich jetzt machen?

BEARBEITEN: Apple sagt: "Wenn Sie Swift-Code in Objective-C importieren, verlassen Sie sich auf eine Xcode-generated Headerdatei, um diese Dateien für Objective-C verfügbar zu machen. [...] Der Name dieses Headers ist der Name Ihres Produktmoduls indem Sie "-Swift.h" hinzufügen. "

Jetzt, wenn ich diese Datei importieren möchte, gibt es einen Fehler:

    //MainMenu.m

    #import "myProjectModule-Swift.h" //Error: 'myProjectModule-Swift.h' file not found

    @implementation MainMenu

Hier ist meine FBManager.swift Datei:

@objc class FBManager: NSObject {

    var descr = "FBManager class"

    init() {
        super.init()
    }

    func desc(){
        println(descr)
    }

    func getSharedGameState() -> GameState{
        return GameState.sharedGameState() //OK! GameState is written in Objective-C and no error here
    }
}

Auch für diejenigen von euch mit einem Framework-Ziel wahrscheinlich hilfreich:

Die Importanweisung der automatisch generierten Header-Datei unterscheidet sich etwas von den App-Zielen. Zusätzlich zu den anderen Dingen in anderen Antworten erwähnt verwenden

#import <ProductName/ProductModuleName-Swift.h>

Anstatt von

#import "ProductModuleName-Swift.h"

gemäß Apple-Dokumentation zu Mix & Match für Framework-Ziele.


Erlaube Xcode, seine Arbeit zu erledigen, füge Swift Header nicht manuell hinzu. Füge einfach @objc vor deiner Swift Klasse hinzu.

@objc class YourSwiftClassName: UIViewController

Suchen Sie in Ihrer Projekteinstellung nach Unterflaggen und ändern Sie sie in YES (sowohl Projekt als auch Ziel)

Defines Module : YES
Always Embed Swift Standard Libraries : YES
Install Objective-C Compatibility Header : YES

Dann putze das Projekt und baue es einmal, nach dem Build erfolgreich (es sollte wahrscheinlich) unter Header-Datei in Ihrer Ziel-C-Klasse-M-Datei importieren

#import "YourProjectName-Swift.h" 

Boooom!


Erstellen Sie die Header-Datei nicht selbst. Löschen Sie den von Ihnen erstellten.

@objc Sie sicher, dass Ihre Swift-Klassen mit @objc markiert @objc oder von einer Klasse erben, die (direkt oder indirekt) von NSObject .

Xcode wird die Datei nicht generieren, wenn Sie Compilerfehler in Ihrem Projekt haben - stellen Sie sicher, dass Ihr Projekt sauber erstellt wird.


Ich habe den gleichen Fehler: myProjectModule-Swift.h Datei nicht gefunden ", aber in meinem Fall war der wahre Grund in falsche Bereitstellung Ziel:" Swift ist nicht verfügbar auf OS X vor 10.9; Bitte setze MACOSX_DEPLOYMENT_TARGET auf 10.9 oder später (derzeit ist es '10.7') "also, wenn ich das Implementierungsziel auf 10.9 geändert habe - das Projekt wurde erfolgreich kompiliert.


Ich habe gerade festgestellt, dass das Hinzufügen eines Verzeichnisses schneller Dateien zu einem Projekt nicht funktioniert. Sie müssen zuerst eine Gruppe für das Verzeichnis erstellen und dann die Swift-Dateien hinzufügen ...


Ich hatte Probleme darin, dass ich meinem objective-c bridging-Header Klassen hinzufügen würde, und in den objective-c-Kopfzeilen, die importiert wurden, versuchten sie, den swift-Header zu importieren. Es mochte das nicht.

In allen meinen objective-c-Klassen, die swift verwenden, aber auch überbrückt sind, bestand der Schlüssel darin, sicherzustellen, dass Sie Vorwärtsklassendeklarationen in den Headern verwenden und dann die Datei "* -Swift.h" in die .m-Datei importieren.


Ich hatte das gleiche Problem und es stellte sich heraus, dass spezielle Symbole im Modulnamen durch xcode ersetzt wurden (in meinem Fall waren Bindestriche Unterstriche). Überprüfen Sie in den Projekteinstellungen "Modulname", um den Modulnamen für Ihr Projekt zu finden. Verwenden ModuleName-Swift.h entweder ModuleName-Swift.h oder benennen Sie das Modul in den Einstellungen um.


Ich musste keine Einstellungen im Build ändern oder @obj zur Klasse hinzufügen.

Alles, was ich tun musste, war die Erstellung eines Bridge-Headers, der automatisch erstellt wurde, als ich Swift-Klassen in das Objective-c-Projekt erstellte. Und dann musste ich einfach tun

Importieren Sie "Bedtime-Swift.h" <- inside objective-c-Datei, die diese schnelle Datei verwenden musste.


In meinem Fall, abgesehen von diesen Schritten:

  1. Name des Produktmoduls: MeinProjekt
  2. Definiert Modul: JA
  3. Eingebetteter Inhalt enthält Swift: YES
  4. Installieren Sie Objective-C-Kompatibilitätsheader: JA
  5. Objective-C Überbrückungskopf: $ (SRCROOT) /Sources/SwiftBridging.h

Ich musste die Klasse öffentlich machen , um die Datei productName-Swift.h zu erstellen:

import UIKit

   @objc public class TestSwift: NSObject {
       func sayHello() {
          print("Hi there!")
       }
   }

Mein Problem war, dass ich stecken blieb, nachdem xcode die Bridge-Datei erstellt hatte, aber immer noch Fehler im Header-Dateinamen MYPROJECTNAME-swift.h

1. Ich checke Terminal ein und suche nach allen automatisch erstellten Swift-Bridge-Dateien:

find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -

Sie sehen, was xcode erstellt hat.

  1. in meinem Fall hatte ich Platz in meinem Projektnamen und xcode ersetzen das ist "_"

Stellen Sie sicher, dass Ihr Projekt ein Modul definiert und Sie dem Modul einen Namen gegeben haben. Erstellen Sie dann neu, und Xcode erstellt die -Swift.h , die Sie importieren können.

Sie können die Moduldefinition und den Modulnamen in Ihren Projekteinstellungen festlegen.


Es gibt zwei Bedingungen,

  • Verwenden Sie Ihre schnelle Datei in Ziel-C-Datei.
  • Verwenden Sie Ihre Ziel-C-Datei in Swift-Datei.

Zu diesem Zweck müssen Sie folgende Schritte ausführen:

  • Fügen Sie Ihre schnelle Datei in ein Ziel-C-Projekt ein oder umgekehrt.
  • Erstellen Sie eine Headerdatei (.h).
  • Gehen Sie zu Build-Einstellungen und führen Sie die folgenden Schritte mit der Suche aus:

    1. Suchen Sie nach diesem Text "brid" und setzen Sie einen Pfad Ihrer Header-Datei.
    2. "Definiert Modul": JA.
    3. "Swift Standard Libraries immer einbetten": JA.
    4. "Objective-C-Kompatibilitätsheader installieren": JA.

Danach reinigen Sie Ihr Projekt und erstellen Sie es neu.

Verwenden Sie Ihre schnelle Datei in Ziel-C-Datei.

In diesem Fall schreibe zuerst "@objc" vor deine Klasse in swift file.

Danach schreiben Sie in Ihrer objektiven c-Datei

  #import "YourProjectName-Swift.h"

Verwenden Sie Ihre Ziel-C-Datei in Swift-Datei.

In diesem Fall schreiben Sie in Ihre Header-Datei

  #import "YourObjective-c_FileName.h"

Ich hoffe, dies wird dir helfen.







swift