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


260

Ich versuche, SwiftCode in meine App zu integrieren. Meine App ist geschrieben Objective-Cund ich habe eine SwiftKlasse hinzugefügt . Ich habe alles hier beschrieben . Aber mein Problem ist, Xcodedass nicht die -Swift.hDatei erstellt wurde, sondern nur die Bridging-Header. Also habe ich es erstellt, aber es ist tatsächlich leer. Ich kann alle meine ObjC-Klassen in Swift verwenden, aber ich kann es nicht umgekehrt tun. Ich habe meine schnelle Klasse mit markiert, @objcaber 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-generatedHeader-Datei, um diese Dateien für Objective-C verfügbar zu machen . [...] Der Name dieses Headers ist der Name Ihres Produktmoduls, gefolgt vom Hinzufügen von" -Swift.h "."

Wenn ich diese Datei importieren möchte, wird ein Fehler angezeigt:

    //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
    }
}

27
YourProjectName-Swift.hsollte eine magische Header-Datei sein, die Xcode während der Kompilierung automatisch für Sie erstellt (Sie werden sie im Projektbrowser nicht wirklich sehen). Löschen Sie die von Ihnen erstellte #import YourProjectName-Swift.hDatei und fügen Sie sie zu den Dateien hinzu, in denen Sie die Swift-Klassen verwenden möchten.
Greg

3
Wird Ihre App, die Sie erstellen, aufgerufen myProjectModule? Die -Swift.hDatei sollte mit Ihrem App-Namen beginnen. Haben Sie eine Datei, die auf endet -Bridging-Header.h? Du solltest. In diesem Fall ist der erste Teil dieser Datei Ihr Projektname. Kombinieren Sie den ersten Teil dieses Dateinamens mit -Swift.hund das sollten Sie einschließen.
Vacawama

4
Ich habe dies erfolgreich in meinem Projekt arbeiten, und dennoch gibt es keine tatsächliche Datei -Swift.h, die auf meinem Mac endet , und dennoch kann ich sie einschließen. Lassen Sie sich also nicht auf die Suche nach einer solchen Datei ein. Stellen Sie einfach sicher, dass Sie es richtig benennen.
Vacawama

2
@vacawama Beachten Sie, dass Sie den Inhalt sehen können, nachdem Sie die Importanweisung zu einer Objective-C-Datei hinzugefügt haben, indem Sie bei gedrückter Befehlstaste auf den Import klicken, als würden Sie eine andere Header-Datei besuchen.
Kendall Helmstetter Gelner

4
Ich musste verwenden#import <MyProjectName/MyProjectName-Swift.h>
Oliver Pearmain

Antworten:


516

Ich habe ungefähr 4 Stunden lang versucht, Swiftmein XcodeObjective-C-basiertes Projekt zu aktivieren . Meine myproject-Swift.hDatei wurde erfolgreich erstellt, aber meine Xcodehat meine nicht gesehen Swift-classes. Also habe ich beschlossen, ein neues XcodeObjc-basiertes Projekt zu erstellen und schließlich die richtige Antwort gefunden! Hoffe dieser Beitrag hilft jemandem :-)

Schritt für Schritt Schnelle Integration für ein Xcode Objc-basiertes Projekt:

  1. Erstellen Sie eine neue *.swiftDatei (in Xcode) oder fügen Sie sie mit dem Finder hinzu.
  2. Erstellen Sie eine, Objective-C bridging headerwenn Xcode Sie danach fragt.
  3. Implementieren Sie Ihre Swift-Klasse:

    import Foundation
    
    // use @objc or @objcMembers annotation if necessary
    class Foo {
        //..
    }
  4. Öffnen Sie die Build-Einstellungen und überprüfen Sie die folgenden Parameter:

    • Definiert Modul: YES

      Kopieren und Einfügen des Parameternamens in eine Suchleiste

    • Name des Produktmoduls: myproject

      Stellen Sie sicher, dass Ihr Produktmodulname keine Sonderzeichen enthält

    • Installieren Sie den Objective-C-Kompatibilitätsheader: YES

      Sobald Sie *.swiftdem Projekt eine Datei hinzugefügt haben , wird diese Eigenschaft in den Build-Einstellungen angezeigt

    • Von Objective-C generierter Schnittstellenheader: myproject-Swift.h

      Dieser Header wird von Xcode automatisch generiert

    • Objective-C-Bridging-Header: $(SRCROOT)/myproject-Bridging-Header.h
  5. Importieren Sie den Swift-Schnittstellenheader in Ihre * .m-Datei.

    #import "myproject-Swift.h"

    Achten Sie nicht auf Fehler und Warnungen.

  6. Bereinigen Sie Ihr Xcode-Projekt und erstellen Sie es neu.
  7. Profitieren!

2
Hat jemand in Schritt 4 oben eine Erwähnung der erforderlichen Konfiguration (zumindest für mich) in der Dokumentation unter: developer.apple.com/library/prerelease/ios/documentation/Swift/… gesehen ? Wenn es so ist, habe ich es verpasst. Danke @sig.
Morkrom

2
Mein Problem war viel einfacher - ich konnte die Datei nicht finden, "myproject-Swift.h"daher scheint es mir, dass sie nicht funktioniert. Anscheinend ist diese Datei im Projektnavigator nicht sichtbar.
Asaf

6
@Asaf Ja, diese Datei wird automatisch von Xcode generiert und befindet sich in Ihrem Projekterstellungspfad. Sie können diese Datei also manuell im Finder / in der Konsole finden oder direkt in Xcode öffnen, indem Sie Cmd + LeftClick on verwenden #import "myproject-Swift.h".
Sig

1
Was mich betrifft, war # 5 genug, um das Problem zu beheben !!
Skywinder

12
Mit diesen 4 Stunden haben Sie hundert unserer Stunden gespart. Vielen Dank :) Gespeichert in meinem Favoriten;)
Abo3atef

65

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

Stellen Sie sicher, dass Ihre Swift-Klassen mit @objceiner Klasse markiert sind oder von dieser erben, die (direkt oder indirekt) von dieser abgeleitet ist NSObject.

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


8
baubar zu sein war der Schlüssel für mich. Konnte nicht erstellt werden, weil meine Datei -swift.h nicht gefunden werden konnte, aber meine Datei -swift.h konnte nicht gefunden werden, da sie nicht erstellt werden konnte: /
anders

13
@anders, während Sie in diesem Zyklus gefangen sind, können Sie verwenden, um find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -uzu sehen, ob die Datei mit einem unerwarteten Namen erstellt wurde, wie er für mich war. :)
CodeReaper

38

Erlauben Sie Xcode, seine Arbeit zu erledigen, und fügen Sie den Swift-Header nicht manuell hinzu. Fügen Sie einfach @objc vor Ihrer Swift-Klasse hinzu.

@objc class YourSwiftClassName: UIViewController

Suchen Sie in Ihrer Projekteinstellung nach den folgenden Flags und ändern Sie sie in JA (sowohl Projekt als auch Ziel).

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

Bereinigen Sie dann das Projekt und erstellen Sie es einmal. Nachdem der Build erfolgreich war (sollte es wahrscheinlich sein), importieren Sie es unter der Header-Datei in Ihre M-Datei der Objective-C-Klasse

#import "YourProjectName-Swift.h" 

Boooom!


1
Danke, das war fantastisch einfach und hat mein Problem gelöst.
Felipe

Ich sehe keine dieser Optionen in den Build-Einstellungen (Xcode 7.3.1). Was soll ich machen?
Iosdude

1
^ Hat Zum Umschalten von Basiczu Allin der oberen Leiste.
Iosdude

1
Embedded Content Contains Swiftwurde geändert Always Embed Swift Standard Librariesmit Xcode 8: stackoverflow.com/questions/38792650/…
William Grand

@ WilliamGrand Danke für den Vorschlag, die Antwort aktualisiert.
Bharat Modi

28

Wahrscheinlich auch hilfreich für diejenigen unter Ihnen, die ein Framework-Ziel haben :

Die import-Anweisung der automatisch generierten Header-Datei unterscheidet sich ein wenig von den App-Zielen. Zusätzlich zu den anderen in anderen Antworten genannten Dingen verwenden

#import <ProductName/ProductModuleName-Swift.h>

anstatt

#import "ProductModuleName-Swift.h"

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


1
@ Dinesharjani Ich bin froh, dass ich helfen konnte! :)
Jeehut

Was ist mit Bündelzielen?
Iulian Onofrei

14

Stellen Sie sicher, dass Ihr Projekt ein Modul definiert und Sie dem Modul einen Namen gegeben haben. Dann neu erstellen und Xcode erstellt die -Swift.hHeader-Datei und Sie können importieren.

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


14

Details: Objective-C-Projekt mit Swift 3-Code in Xcode 8.1

Aufgaben:

  1. Verwenden Sie eine schnelle Aufzählung in der Ziel-C-Klasse
  2. Verwenden Sie die Zielgruppe in der schnellen Klasse

VOLLSTÄNDIGE PROBE

1. Objective-C-Klasse, die Swift-Enumeration verwendet

ObjcClass.h

#import <Foundation/Foundation.h>

typedef NS_ENUM(NSInteger, ObjcEnum) {
    ObjcEnumValue1,
    ObjcEnumValue2,
    ObjcEnumValue3
};

@interface ObjcClass : NSObject

+ (void) PrintEnumValues;

@end

ObjcClass.m

#import "ObjcClass.h"
#import "SwiftCode.h"

@implementation ObjcClass

+ (void) PrintEnumValues {
    [self PrintEnumValue:SwiftEnumValue1];
    [self PrintEnumValue:SwiftEnumValue2];
    [self PrintEnumValue:SwiftEnumValue3];
}

+ (void) PrintEnumValue:(SwiftEnum) value {
    switch (value) {
        case SwiftEnumValue1:
            NSLog(@"-- SwiftEnum: SwiftEnumValue1");
            break;

        case SwiftEnumValue2:
        case SwiftEnumValue3:
            NSLog(@"-- SwiftEnum: long value = %ld", (long)value);
            break;
    }
}

@end

Erkennen Sie den Swift-Code im Objective-C-Code

In meinem Beispiel verwende ich SwiftCode.h, um Swift-Code in Objective-C zu erkennen. Diese Datei wird automatisch generiert (ich habe in einem Projekt keine physische Kopie dieser Header-Datei erstellt), und Sie können nur den Namen dieser Datei festlegen:

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Wenn der Compiler den Swift-Code Ihrer Header-Datei nicht finden kann, versuchen Sie, das Projekt zu kompilieren.

2. Schnelle Klasse, die Objective-C-Enumeration verwendet

import Foundation

@objc
enum SwiftEnum: Int {
    case Value1, Value2, Value3
}

@objc
class SwiftClass: NSObject {

    class func PrintEnumValues() {
        PrintEnumValue(.Value1)
        PrintEnumValue(.Value2)
        PrintEnumValue(.Value3)
    }

    class func PrintEnumValue(value: ObjcEnum) {
        switch value {
        case .Value1, .Value2:
            NSLog("-- ObjcEnum: int value = \(value.rawValue)")

        case .Value3:
            NSLog("-- ObjcEnum: Value3")
            break
        }

    }
}

Erkennen Sie den Objective-C-Code im Swift-Code

Sie müssen eine Bridging-Header-Datei erstellen. Wenn Sie eine Swift-Datei in ein Objective-C-Projekt oder eine Objective-C-Datei in ein Swift-Projekt einfügen, schlägt Xcode vor, einen Bridging-Header zu erstellen.

Geben Sie hier die Bildbeschreibung ein

Sie können den Namen der Bridging-Header-Datei hier ändern:

Geben Sie hier die Bildbeschreibung ein

Bridging-Header.h

#import "ObjcClass.h"

Verwendung

#import "SwiftCode.h"
...
[ObjcClass PrintEnumValues];
[SwiftClass PrintEnumValues];
[SwiftClass PrintEnumValue:ObjcEnumValue3];

Ergebnis

Geben Sie hier die Bildbeschreibung ein


MEHR PROBEN

Vollständige Integrationsschritte Objective-c und Swift, wie oben beschrieben . Jetzt werde ich einige andere Codebeispiele schreiben.

3. Rufen Sie die Swift-Klasse über den Objective-c-Code auf

Schnelle Klasse

import Foundation

@objc
class SwiftClass:NSObject {

    private var _stringValue: String
    var stringValue: String {
        get {
            print("SwiftClass get stringValue")
            return _stringValue
        }
        set {
            print("SwiftClass set stringValue = \(newValue)")
            _stringValue = newValue
        }
    }

    init (stringValue: String) {
        print("SwiftClass init(String)")
        _stringValue = stringValue
    }

    func printValue() {
        print("SwiftClass printValue()")
        print("stringValue = \(_stringValue)")
    }

}

Objective-C-Code (aufrufender Code)

SwiftClass *obj = [[SwiftClass alloc] initWithStringValue: @"Hello World!"];
[obj printValue];
NSString * str = obj.stringValue;
obj.stringValue = @"HeLLo wOrLd!!!";

Ergebnis

Geben Sie hier die Bildbeschreibung ein

4. Rufen Sie die Objective-c-Klasse aus dem Swift-Code auf

Objective-C-Klasse (ObjcClass.h)

#import <Foundation/Foundation.h>

@interface ObjcClass : NSObject
@property NSString* stringValue;
- (instancetype) initWithStringValue:(NSString*)stringValue;
- (void) printValue;
@end

ObjcClass.m

#import "ObjcClass.h"

@interface ObjcClass()

@property NSString* strValue;

@end

@implementation ObjcClass

- (instancetype) initWithStringValue:(NSString*)stringValue {
    NSLog(@"ObjcClass initWithStringValue");
    _strValue = stringValue;
    return self;
}

- (void) printValue {
    NSLog(@"ObjcClass printValue");
    NSLog(@"stringValue = %@", _strValue);
}

- (NSString*) stringValue {
    NSLog(@"ObjcClass get stringValue");
    return _strValue;
}

- (void) setStringValue:(NSString*)newValue {
    NSLog(@"ObjcClass set stringValue = %@", newValue);
    _strValue = newValue;
}

@end

Schneller Code (aufrufender Code)

if let obj = ObjcClass(stringValue:  "Hello World!") {
    obj.printValue()
    let str = obj.stringValue;
    obj.stringValue = "HeLLo wOrLd!!!";
}

Ergebnis

Geben Sie hier die Bildbeschreibung ein

5. Verwenden Sie die Swift-Erweiterung im Objective-c-Code

Schnelle Erweiterung

extension UIView {
    static func swiftExtensionFunc() {
        NSLog("UIView swiftExtensionFunc")
    }
}

Objective-C-Code (aufrufender Code)

[UIView swiftExtensionFunc];

6. Verwenden Sie die Objective-c-Erweiterung in Swift-Code

Objective-C-Erweiterung (UIViewExtension.h)

#import <UIKit/UIKit.h>

@interface UIView (ObjcAdditions)
+ (void)objcExtensionFunc;
@end

UIViewExtension.m

@implementation UIView (ObjcAdditions)
+ (void)objcExtensionFunc {
    NSLog(@"UIView objcExtensionFunc");
}
@end

Schneller Code (aufrufender Code)

UIView.objcExtensionFunc()

Diese Beispiele sind wirklich hilfreich, danke! Und was Swift 4+ betrifft, müssen wir @objcMembersvor der Klasse hinzufügen . Weil die @objcInferenz in Swift 4 zu Optimierungszwecken reduziert wurde. Beispielsweise wird eine Eigenschaft in einer von NSObject abgeleiteten Klasse standardmäßig nicht mehr auf @objc schließen (wie in Swift 3). Ich habe diese Informationen aus dieser Antwort erhalten .
Hustlion

11

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). Aktivieren Sie in den Projekteinstellungen "Modulname", um den Modulnamen für Ihr Projekt zu finden. Verwenden Sie danach ModuleName-Swift.hdas Modul oder benennen Sie es in den Einstellungen um.


10
Ich bin ein Idiot. Ich habe den Klassennamen hinzugefügt und dann "-Swift" angehängt. Es stellt sich heraus, dass es der "Modul" -Name ist. +1, damit ich das merke.
HotFudgeSunday

2
Ein anderer Idiot hier, der dachte, es sei der Klassenname!
Charlie Martin

9

Die Datei wird automatisch erstellt (hier geht es um Xcode 6.3.2). Sie werden es jedoch nicht sehen, da es sich in Ihrem Ordner für abgeleitete Daten befindet. Nachdem Sie Ihre schnelle Klasse mit markiert haben @objc, kompilieren Sie sie und suchen Sie sie Swift.hin Ihrem Ordner für abgeleitete Daten. Dort sollten Sie den Swift-Header finden.

Ich hatte das Problem, dass Xcode meine my-Project-Swift.hin my_Project-Swift.hXcode umbenannte "." "-"Symbole usw. nicht mag . Mit der obigen Methode können Sie den Dateinamen finden und in eine Objective-C-Klasse importieren.


1
Auch das hat mein Problem gelöst. In meine .m Datei importiere ich die Datei wie folgt #import "my_project-Swift.h" und mein tatsächlicher Projektname istmy-project
Bhavin_m

Achtung - nicht nur "." "-" auch Leerzeichen :(
user1105951

8

Fügen Sie einfach #import "myProject-Swift.h" in die Datei .m oder .h ein

PS Sie finden "myProject-Swift.h" nicht im Dateiinspektor, es ist versteckt. Es wird aber automatisch von der App generiert.


Danke für das Heads-up, Kumpel.
Felipe

Diese Antwort hat mir geholfen und meinen Tag gerettet. Das Wichtigste ist, dass Xcode es automatisch generiert und es sich um eine HIDDEN-Datei handelt. Ich habe "myProject-Swift.h" selbst erstellt und es hat nicht funktioniert.
C0mrade

5

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

  1. Name des Produktmoduls: $ (PRODUCT_NAME: c99extidentifier)
  2. Definiert Modul: NO
  3. Eingebetteter Inhalt enthält Swift: NO
  4. Installieren Sie den Objective-C-Kompatibilitätsheader: YES
  5. Objective-C-Bridging-Header: ProjectName-Bridging-Header.h

Der letzte Punkt (5) war entscheidend. Ich habe es nur in den zweiten Abschnitt ( Geben Sie hier die Bildbeschreibung einZielfeld) eingefügt , das Projektfeld sollte leer bleiben: Andernfalls wurde nicht die richtige "Project-Swift.h" -Datei für mich generiert (es enthielt keine schnellen Methoden).


1
auch ein hilfreicher Link: ericasadun.com/2014/08/21/…
Darius Miliauskas

1
Danke Danke Danke Vielen Dank @DariusMiliauskas hat es nur mit Ihrem Link zum
Laufen gebracht

1
@DariusMiliauskas Vielen Dank! Die 5 Punkte lösten auch das Problem für mich im alten Xcode-Projekt
tatiana_c

Define Modulessollte sein No??
Sunil Chauhan


5

Es gibt zwei Bedingungen:

  • Verwenden Sie Ihre schnelle Datei in der Ziel-C-Datei.
  • Verwenden Sie Ihre Ziel-C-Datei in einer schnellen Datei.

Zu diesem Zweck müssen Sie die folgenden Schritte ausführen:

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

    1. Suchen Sie nach diesem Text "Brid" und legen Sie einen Pfad für Ihre Header-Datei fest.
    2. "Definiert das Modul": JA.
    3. "Immer schnelle Standardbibliotheken einbetten": JA.
    4. "Objective-C-Kompatibilitätsheader installieren": JA.

Bereinigen Sie danach Ihr Projekt und erstellen Sie es neu.

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

In diesem Fall schreiben Sie zuerst "@objc" vor Ihre Klasse in eine schnelle Datei.

Schreiben Sie danach in Ihre Ziel-c-Datei Folgendes:

  #import "YourProjectName-Swift.h"

Verwenden Sie Ihre Ziel-C-Datei in einer schnellen Datei.

In diesem Fall schreiben Sie Folgendes in Ihre Header-Datei:

  #import "YourObjective-c_FileName.h"

Ich hoffe, dies wird dir helfen.


4

Für Swift 5:

  1. Fügen Sie das @objcSchlüsselwort Ihrer Klasse und Ihren Methoden hinzu
  2. Fügen Sie publicIhrer Klasse und Ihren Methoden ein Schlüsselwort hinzu
  3. Lassen Sie Ihre Klasse von erben NSObject
  4. Projekt erstellen
  5. Fügen Sie #import "MyProject-Swift.h"Ihre Objective-C-Datei ein

    @objc
    public class MyClass: NSObject {
    
        @objc
        public func myMethod() {
    
        }
    }

"Fügen Sie das Schlüsselwort @objc zu Ihrer Klasse und Ihren Methoden hinzu" - das gleiche gilt für Swift 4
Krzysztof Skrzynecki

3

In meinem Fall, abgesehen von diesen Schritten:

  1. Name des Produktmoduls: myproject
  2. Definiert das Modul: JA
  3. Eingebetteter Inhalt enthält Swift: YES
  4. Installieren Sie den Objective-C-Kompatibilitätsheader: YES
  5. Objective-C-Bridging-Header: $ (SRCROOT) /Sources/SwiftBridging.h

Ich habe benötigt , um die Klasse zu setzen Öffentlichkeit zu schaffen , um product-Swift.h - Datei:

import UIKit

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

2

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


@ <spezifische Klasse>; sollte definiert werden, und dann sieht das using-Projekt diese Dateien.
Nikita

2

Ich hatte das gleiche Problem und schließlich schien es, dass sie nicht an die gleichen Ziele gebunden waren. Die ObjC-Klasse ist an Target1 und Target2 angehängt, die Swift-Klasse ist nur an Target1 angehängt und in der ObjC-Klasse nicht sichtbar.

Hoffe das hilft jemandem.


Ich habe dies mit verschiedenen Zielen für Inszenierung und Produktion völlig übersehen. Vielen Dank für Ihre Antwort!
Benjamin Martin

Was bedeutet "angehängt"?
Iulian Onofrei

"angefügt" = "Mitglieder", sie sollten als
Zielmitglieder

1

Mein Problem war, dass ich feststeckte, nachdem xcode die Bridge-Datei erstellt hatte, aber dennoch eine Fehlermeldung im Header-Dateinamen MYPROJECTNAME-swift.h auftrat

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

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

Sie sehen, welcher Xcode erstellt wurde.

  1. In meinem Fall hatte ich Platz in meinem Projektnamen und xcode ersetzt dies ist '_'

1

Wenn Sie dem Projekt neue Swift-Dateien hinzufügen, stellen Sie bitte sicher, dass Sie sie zu den richtigen Zielen hinzufügen. Stellen Sie sicher, dass jede schnelle Datei, die Sie verwenden möchten, die NSObject-Klasse erbt und in den Build-Einstellungen unter der Option ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES mit @ObjCMembers Change to YES versehen ist. Wechseln Sie in den Build-Einstellungen unter der Option DEFINES_MODULE zu YES.


0

Ich habe den gleichen Fehler: myProjectModule-Swift.hDatei nicht gefunden ", aber in meinem Fall lag der wahre Grund im falschen Bereitstellungsziel:" Swiftist unter OS X vor 10.9 nicht verfügbar; Bitte MACOSX_DEPLOYMENT_TARGETauf 10.9 oder höher einstellen (derzeit ist es '10 .7 ') "Wenn ich also das Bereitstellungsziel auf 10.9 geändert habe, wurde das Projekt erfolgreich kompiliert.


0

Mein Problem war, dass die automatische Generierung der Datei -swift.h eine Unterklasse von CustomDebugStringConvertible nicht verstehen konnte. Ich habe die Klasse geändert, um stattdessen eine Unterklasse von NSObject zu sein. Danach enthielt die Datei -swift.h die Klasse nun ordnungsgemäß.


0

Ich hatte Probleme damit, dass ich meinem Objective-C-Bridging-Header Klassen hinzufügte, und in den importierten Objective-C-Headern wurde versucht, den schnellen Header zu importieren. Das hat mir nicht gefallen.

In allen meinen Objective-C-Klassen, die Swift verwenden, aber auch überbrückt sind, bestand der Schlüssel darin, sicherzustellen, dass Sie Forward-Klassendeklarationen in den Headern verwenden, und dann die Datei "* -Swift.h" in die .m-Datei zu importieren.


0

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

Alles, was ich tun musste, war, einen Bridge-Header zu erstellen, der automatisch erstellt wurde, als ich Swift-Klassen in Objective-c-Projekt erstellte. Und dann musste ich einfach tun

Importieren Sie "Bedtime-Swift.h" <- in die Objective-C-Datei, die zur Verwendung dieser Swift-Datei benötigt wurde.


0

Nun, nachdem ich alle Kommentare gelesen und versucht und gelesen und erneut versucht hatte, gelang es mir, schnelle Klassen in mein Big obj-c-Projekt aufzunehmen. Also, danke für all die Hilfe. Ich wollte einen Tipp teilen, der mir half, den Prozess besser zu verstehen. Gehen Sie in der Klasse .m zur Importzeile des schnellen Zielnamens #import "myTargetName-Swift.h" und klicken Sie auf den Schlüssel:

Befehl + Mausklick -> Zur Definition springen Geben Sie hier die Bildbeschreibung ein

Dort können Sie die gesamte Übersetzung von schnell nach obj-c sehen und dort finden Sie die verschiedenen Funktionen, die in obj-c neu deklariert wurden. Ich hoffe, dieser Tipp hilft Ihnen genauso wie mir.


0

Verwenden von Swift-Klassen in Objective-C

Wenn Sie Code in ein App-Ziel importieren möchten (Mischen von Objective-C und Swift in einem Projekt), sollten Sie die nächste Importzeile verwenden #import "<#YourProjectName#>-Swift.h", um Swift-Code für Objective-C-Code verfügbar zu machen [Mischen von Swift- und Objective-C-Code in einem Projekt]

In diesem Beitrag werde ich beschreiben, wie die statische Swift-Bibliothek in Objective-C-Code importiert wird

Objective-C-Consumer -> Schnelle statische Bibliothek

Xcode Version 10.2.1

Erstellen Sie eine statische Swift-Bibliothek

Folgen Sie Create Swift static librarymit den nächsten Ergänzungen:

Stellen Sie die Swift-API bereit. So verwenden Sie Swifts Funktionen aus Objective-C [About]

Nach dem Erstellen sollten Sie eine <product_name>-Swift.hDatei finden, die sich in DerivedSources [Datei nicht gefunden] befinden sollte.

Objective-C-Consumer mit statischer Swift-Bibliothek

Drag and dropdie Binärdatei in das Xcode-Projekt [About]

Link Library[Undefinierte Symbole] [Link vs Embed]

Project editor -> select a target -> General -> Linked Frameworks and Libraries -> add -> Add Others... -> point to `lib<product_name>.a` file
//or
Project editor -> select a target -> Build Phases -> Link Binary With Libraries -> add -> Add Others... -> point to `lib<product_name>.a` file

Hinzufügen Library Search paths[Bibliothek nicht gefunden für] [Rekursiver Pfad]

Project editor -> select a target -> Build Settings -> Search Paths -> Library Search paths -> add path to the parent of `lib<product_name>.a` file

Hinzufügen Header Search Paths[Modul nicht gefunden] [Rekursiver Pfad]

Project editor -> select a target -> Build Settings -> Search Paths -> Header Search Paths -> add path to generated `<product_name>-Swift.h` file 

Fügen Sie .swift filedem Objective-C-Projekt leer hinzu . [Undefinierte Symbole] Wenn Sie nach Xcode fragen, drücken Sie Erstellen Bridging Header(es wird erstellt module_name-Bridging-Header.h) und richten Sie einen Pfad zu dieser Datei in ein

Project editor -> select a target -> Build Settings -> Swift Compiler - General -> Objective-C Bridging Header

Modul in den Objective-C-Clientcode importieren [Datei nicht gefunden] [Modulname]

#import "module_name-Swift.h"

Weitere Beispiele hier


0

XCode 11.3.1:

Wenn ich eine innere Swift-Klasse in einem Objektcode verwenden möchte, wird sie nicht für den Fehler "undefiniertes Symbol" kompiliert (für störende innere Klasse und äußere Klasse). Ich habe den generierten Header "-swift.h" überprüft und beide Klassen sind Dort.

Nachdem ich es stundenlang versucht habe, konvertiere ich die innere Klasse in eine normale Klasse und sie wird kompiliert.

Ich bereinige das Projekt, lösche den DerivedData-Ordner und es wird kompiliert.


1
Haben Sie versucht, @objcvor der Deklaration der inneren Klasse hinzuzufügen ?
22.

danke @dnnagy, überprüft, dass es kein Syntaxproblem ist.
Bill Chan

-1

Nachdem ich alles oben getan habe, habe ich immer noch Fehler. Mein Problem war schließlich, dass die benötigten Swift-Dateien aus irgendeinem Grund nicht zu den Bundle-Ressourcen hinzugefügt wurden.

Ich habe dies behoben, indem ich zu [MyTarget]> Build Phases> Copy Bundle Resources gegangen bin, dann auf die Plus-Schaltfläche geklickt und die Swift-Dateien hinzugefügt habe.


Copy Bundle Resources sollte keinen Quellcode enthalten
Bill Chan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.