Utilizzo delle classi Objective-C in Swift
Se hai una classe esistente che desideri utilizzare, esegui il passaggio 2 e vai al passaggio 5 . (Per alcuni casi, ho dovuto aggiungere un esplicito #import <Foundation/Foundation.h
a un vecchio file Objective-C.)
Passaggio 1: aggiungere l'implementazione di Objective-C - .m
Aggiungi un .m
file alla tua classe e chiamalo CustomObject.m
.
Passaggio 2: Aggiungi intestazione ponte
Quando aggiungi il tuo .m
file, verrai probabilmente colpito con un prompt simile al seguente:
Fai clic su Sì !
Se il prompt non è stato visualizzato o è stata eliminata accidentalmente l'intestazione del ponte, aggiungere un nuovo .h
file al progetto e denominarlo <#YourProjectName#>-Bridging-Header.h
.
In alcune situazioni, in particolare quando si lavora con framework Objective-C, non si aggiunge esplicitamente una classe Objective-C e Xcode non riesce a trovare il linker. In questo caso, crea il tuo .h
file come indicato sopra, quindi assicurati di collegare il suo percorso nelle impostazioni del progetto di destinazione in questo modo:
Nota:
È consigliabile collegare il progetto utilizzando la $(SRCROOT)
macro in modo che se si sposta il progetto o ci si lavora con altri utilizzando un repository remoto, funzionerà comunque. $(SRCROOT)
può essere pensato come la directory che contiene il tuo file .xcodeproj. Potrebbe apparire così:
$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h
Passaggio 3: Aggiungi intestazione Objective-C - .h
Aggiungi un altro .h
file e chiamalo CustomObject.h
.
Passaggio 4: crea la tua classe Objective-C
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
Passaggio 5: aggiungere classe a Bridging-Header
In YourProject-Bridging-Header.h
:
#import "CustomObject.h"
Passaggio 6: usa il tuo oggetto
In SomeSwiftFile.swift
:
var instanceOfCustomObject = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
print(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()
Non è necessario importare esplicitamente; ecco a cosa serve l'intestazione ponte.
Utilizzo delle classi Swift in Objective-C
Passaggio 1: creare una nuova classe Swift
Aggiungi un .swift
file al tuo progetto e chiamalo MySwiftObject.swift
.
In MySwiftObject.swift
:
import Foundation
@objc(MySwiftObject)
class MySwiftObject : NSObject {
@objc
var someProperty: AnyObject = "Some Initializer Val" as NSString
init() {}
@objc
func someFunction(someArg: Any) -> NSString {
return "You sent me \(someArg)"
}
}
Passaggio 2: importare i file Swift nella classe ObjC
In SomeRandomClass.m
:
#import "<#YourProjectName#>-Swift.h"
Il file: <#YourProjectName#>-Swift.h
dovrebbe già essere creato automaticamente nel tuo progetto, anche se non riesci a vederlo.
Passaggio 3: usa la tua classe
MySwiftObject * myOb = [MySwiftObject new];
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
myOb.someProperty = @"Hello World";
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
NSString * retString = [myOb someFunctionWithSomeArg:@"Arg"];
NSLog(@"RetString: %@", retString);
Appunti:
Se il completamento del codice non si comporta come previsto, prova a eseguire una build rapida ⌘⇧Rper aiutare Xcode a trovare parte del codice Objective-C da un contesto Swift e viceversa.
Se aggiungi un .swift
file a un progetto precedente e ricevi l'errore dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib
, prova a riavviare completamente Xcode .
Sebbene in origine fosse possibile utilizzare classi Swift pure (non discendenti di NSObject
) che sono visibili a Objective-C usando il @objc
prefisso, ciò non è più possibile. Ora, per essere visibile in Objective-C, l'oggetto Swift deve essere o una classe conforme a NSObjectProtocol
(il modo più semplice per farlo è ereditare da NSObject
), oppure essere enum
contrassegnato @objc
con un valore grezzo di un tipo intero come Int
. È possibile visualizzare la cronologia delle modifiche per un esempio di codice Swift 1.x utilizzando @objc
senza queste restrizioni.