iOS
Snelle en objectieve C-interoperabiliteit
Zoeken…
Objective-C Classes gebruiken in Swift
Als je een bestaande klasse hebt die je wilt gebruiken, voer je stap 2 uit en ga je vervolgens naar stap 5 . (In sommige gevallen moest ik een expliciete
#import <Foundation/Foundation.h
aan een ouder ObjC-bestand)
Stap 1: Objective-C-implementatie toevoegen - .m
Voeg een .m
bestand toe aan uw klas en noem het CustomObject.m
Stap 2: Voeg Bridging Header toe
Wanneer u uw .m
bestand toevoegt, wordt u waarschijnlijk getroffen met een prompt die er als volgt uitziet:
Klik JA !
Als u de prompt niet zag of per ongeluk uw bridging-header hebt verwijderd, voegt u een nieuw .h
bestand toe aan uw project en noemt u het <#YourProjectName#>-Bridging-Header.h
In sommige situaties, met name bij het werken met ObjC-frameworks, voegt u een Objective-C-klasse niet expliciet toe en kan Xcode de linker niet vinden. Maak in dit geval uw .h
bestand met de naam zoals hierboven vermeld en zorg er vervolgens voor dat u het pad op de volgende manier in de projectinstellingen van uw doel koppelt:
Notitie
Het is best om uw project te koppelen met behulp van de macro $(SRCROOT)
zodat het nog steeds werkt als u uw project verplaatst of er met anderen aan werkt via een externe repo. $(SRCROOT)
kan worden gezien als de map die uw .xcodeproj-bestand bevat. Het kan er zo uitzien:
$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h
Stap 3: Voeg Objective-C Header toe - .h
Voeg nog een .h
bestand toe en CustomObject.h
naam CustomObject.h
Stap 4: Bouw uw Objective-C-klasse
In CustomObject.h
#import <Foundation/Foundation.h>
@interface CustomObject : NSObject
@property (strong, nonatomic) id someProperty;
- (void) someMethod;
@end
In CustomObject.m
#import "CustomObject.h"
@implementation CustomObject
- (void) someMethod {
NSLog(@"SomeMethod Ran");
}
@end
Stap 5: Klasse toevoegen aan Bridging-Header
In YourProject-Bridging-Header.h
:
#import "CustomObject.h"
Stap 6: Gebruik uw object
In SomeSwiftFile.swift
:
var instanceOfCustomObject: CustomObject = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
println(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()
Het is niet nodig om expliciet te importeren, daar is de bridging header voor.
Swift Classes gebruiken in Objective-C
Stap 1: Maak een nieuwe Swift Class
Voeg een .swift
bestand toe aan uw project en noem het MySwiftObject.swift
In 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
}
}
Stap 2: Importeer Swift-bestanden naar ObjC Class
In SomeRandomClass.m
:
#import "<#YourProjectName#>-Swift.h"
Het bestand: <#YourProjectName#>-Swift.h
zou al automatisch in uw project moeten worden aangemaakt, zelfs als u het niet kunt zien.
Stap 3: Gebruik je klas
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);
Notitie:
1. CodeCompletion gedroeg zich niet zo nauwkeurig als ik zou willen. Op mijn systeem leek het uitvoeren van een snelle build met "cmd + r" Swift te helpen een deel van de Objc-code te vinden en vice versa.
2. Als u een .swift
bestand toevoegt aan een ouder project en de foutmelding krijgt: dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib
, probeer Xcode volledig opnieuw te starten.
3. Hoewel het oorspronkelijk mogelijk was om pure Swift-klassen in Objective-C te gebruiken met het @objc
voorvoegsel, is dit na Swift 2.0 niet langer mogelijk. Zie bewerkingsgeschiedenis voor originele uitleg. Als deze functionaliteit in toekomstige Swift-versies opnieuw wordt ingeschakeld, wordt het antwoord dienovereenkomstig bijgewerkt.