2016-08-06 23 views
1

Ich habe ein Swift Framework erstellt, das ich in mehreren Projekten verwende. Es gibt eine Objectivce-C-Klasse, die ich gerne verwenden würde, die im geraden Swift schwer zu portieren ist. Lassen Sie uns sagen, dass die Klasse SFTestKann ich eine Objective-C-Klasse in meiner Swift-Framework-Bibliothek verwenden?

ist
@interface SFTest { 
} 
+ (NString *)myMethod(NSString *data); 
@end 
@implementation SFTest 
+ (NString *)myMethod(NSString *data) { 
    // does some processing 
    return processedData; 
} 
@end 

Kann ich das irgendwie in meinem Projekt Swift Rahmen verwenden, und wenn ja, wie? Meine Forschung dazu erwähnt etwas, das Bridging-Header genannt wird, aber dass sie nicht in Swift-Frameworks verwendet werden können.

+0

Ich mag nicht CommonCrypto importieren in Swift zu verwenden. Ich möchte nur eine Objective-C-Klasse in einem Swift-Framework verwenden. Ich kann die allgemeine Verschlüsselung im Code entfernen und ein einfacheres Beispiel verwenden. – kailoon

+0

Keine Erwähnung von CommonCrypto entfernt, daher sollte dies viel einfacher mit Ja oder Nein zu beantworten sein. – kailoon

Antwort

12

verwenden Also das dauerte eine Weile, aber ich habe endlich etwas auf meinem Gerät laufen lassen. Hier ist mein Setup. Ich habe ein Swift-Framework namens wiftlib erstellt. Ich habe eine Objective-C-Klasse namens "MyClass" hinzugefügt. Grundsätzlich sieht es wie folgt aus:

enter image description here

ich dann den „Regenschirm-Header“ modifizierte meine neue Objective-C-Klasse zu importieren. Der Schirmtitel ist der Name Ihres schnellen Bibliotheksprojekts. Also in meinem Fall war es "swiftlib.h". Dies ist, was in meiner Regenschirm-Header-Datei ist:

Stellen Sie sicher, Ihre Header-Klasse zu veröffentlichen, oder Sie erhalten einen Kompilierungsfehler. Grundsätzlich ist alles, was in der Schirmüberschrift enthalten ist, Benutzern Ihres schnellen Frameworks zugänglich, so dass es öffentlich sein muss. Wählen Sie MyClass.h und öffnen Sie die richtigen Details Leiste und wählen Sie die Drop-down hier:

enter image description here

habe ich dann diesen Swift Rahmen in einer einzigen Ansicht Anwendung zum Testen und konnte meine Objective-C-Klasse in der Verwendung AppDelegate.swift wie folgt:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
     // Override point for customization after application launch. 
     let test = MyClass.myMethod() 
     print("test = " + String(test)) 
     return true 
    } 

Dies kompiliert und auf meinem Gerät ausgeführt.

Für diejenigen neugierig, war dies die Umsetzung Code für den Objective-C MyClass:

#import "MyClass.h" 
#import <CommonCrypto/CommonCrypto.h> 

@implementation MyClass 

+ (NSString *)myMethod { 
    NSString *key = @"test"; 
    NSString *data = @"mytestdata"; 
    const char *ckey = [key cStringUsingEncoding:NSASCIIStringEncoding]; 
    const char *cdata = [data cStringUsingEncoding:NSASCIIStringEncoding]; 
    unsigned char chmac[CC_SHA256_DIGEST_LENGTH]; 
    CCHmac(kCCHmacAlgSHA256, ckey, strlen(ckey), cdata, strlen(cdata), chmac); 
    NSData *hmac = [[NSData alloc] initWithBytes:chmac length:sizeof(chmac)]; 
    NSString *hash = [hmac base64Encoding]; 
    return hash; 
} 

@end 
+1

Sie haben mir den Tag gerettet^_^ –

+0

ich habe mir stundenlang die Haare ausgezogen. Danke für diese detaillierte Lösung! – oriyentel

-4

Erster Einsatz Ziel c-Klasse im schnellen Projekt müssen Sie in dieser Datei überbrück Header-Datei erstellen Sie Objective-C-Klasse importieren und dann können Sie diese Klasse in schnellen

+2

Sie können Bridging-Header in Swift Frameworks nicht verwenden. – kailoon