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:

ange bildbeskrivning 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å:

ange bildbeskrivning här

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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow