iOS
Snabb och objektiv-C interoperabilitet
Sök…
Använda Objekt-C-klasser i Swift
Om du har en befintlig klass som du vill använda, utför du steg 2 och hoppar sedan över till steg 5 . (I vissa fall var jag tvungen att lägga till en uttrycklig
#import <Foundation/Foundation.h
till en äldre ObjC-fil)
Steg 1: Lägg till objektiv-C-implementering - .m
Lägg till en .m
fil i din klass och namnge den CustomObject.m
Steg 2: Lägg till överbryggande rubrik
När du lägger till din .m
fil kommer du troligtvis att träffas med en prompt som ser ut så här:
Klicka på JA !
Om du inte såg frågan, eller av misstag raderade din överbryggande rubrik, lägg till en ny .h
fil till ditt projekt och namnge den <#YourProjectName#>-Bridging-Header.h
I vissa situationer, särskilt när du arbetar med ObjC-ramverk, lägger du inte en Objekt-C-klass uttryckligen och Xcode kan inte hitta länken. I det här fallet, skapa din .h
fil som nämns ovan och se till att du länkar dess sökväg i ditt måls projektinställningar så:
Notera
Det är bästa praxis att länka ditt projekt med $(SRCROOT)
så att om du flyttar ditt projekt eller arbetar med det med andra med en fjärrrepo kommer det fortfarande att fungera. $(SRCROOT)
kan betraktas som den katalog som innehåller din .xcodeproj-fil. Det kan se ut så här:
$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h
Steg 3: Lägg till Objekt-C Header - .h
Lägg till en ny .h
fil och namnge den CustomObject.h
Steg 4: Bygg din Objekt-C-klass
I CustomObject.h
#import <Foundation/Foundation.h>
@interface CustomObject : NSObject
@property (strong, nonatomic) id someProperty;
- (void) someMethod;
@end
I CustomObject.m
#import "CustomObject.h"
@implementation CustomObject
- (void) someMethod {
NSLog(@"SomeMethod Ran");
}
@end
Steg 5: Lägg till klass i brygghuvud
I YourProject-Bridging-Header.h
:
#import "CustomObject.h"
Steg 6: Använd ditt objekt
I SomeSwiftFile.swift
:
var instanceOfCustomObject: CustomObject = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
println(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()
Du behöver inte importera uttryckligen, det är vad brygghuvudet är för.
Använda Swift-klasser i Objekt-C
Steg 1: Skapa ny Swift-klass
Lägg till en .swift
fil till ditt projekt och namnge den MySwiftObject.swift
I MySwiftObject.swift
:
import Foundation
class MySwiftObject : NSObject {
var someProperty: AnyObject = "Some Initializer Val"
init() {}
func someFunction(someArg:AnyObject) -> String {
var returnVal = "You sent me \(someArg)"
return returnVal
}
}
Steg 2: Importera snabba filer till ObjC Class
I SomeRandomClass.m
:
#import "<#YourProjectName#>-Swift.h"
Filen: <#YourProjectName#>-Swift.h
bör redan skapas automatiskt i ditt projekt, även om du inte kan se det.
Steg 3: Använd din klass
MySwiftObject * myOb = [MySwiftObject new];
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
myOb.someProperty = @"Hello World";
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
NSString * retString = [myOb someFunction:@"Arg"];
NSLog(@"RetString: %@", retString);
Notera:
1. CodeCompletion bete sig inte så exakt som jag skulle vilja. På mitt system verkade det att köra en snabb build w / "cmd + r" hjälpa Swift att hitta en del av Objc-koden och vice versa.
2. Om du lägger till .swift
filen till ett äldre projekt och får fel: dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib
, försök att starta om Xcode igen.
3. Medan det ursprungligen var möjligt att använda rena Swift-klasser i Objekt-C genom att använda prefixet @objc
, efter Swift 2.0, är detta inte längre möjligt. Se redigeringshistorik för originalförklaring. Om den här funktionen återaktiveras i framtida Swift-versioner, kommer svaret att uppdateras i enlighet därmed.