Ricerca…


Utilizzo delle classi Objective-C in Swift

Se si dispone di una classe esistente che si desidera utilizzare, eseguire il passaggio 2 e quindi saltare al passaggio 5 . (In alcuni casi, ho dovuto aggiungere un #import <Foundation/Foundation.h esplicito #import <Foundation/Foundation.h a un file ObjC precedente)

Passaggio 1: aggiungere l'implementazione Objective-C - .m

Aggiungi un file .m alla tua classe e CustomObject.m

Passaggio 2: aggiungi intestazione di ponte

Quando aggiungi il tuo file .m , verrai colpito da un prompt simile al seguente:

inserisci la descrizione dell'immagine qui

Clicca !

Se non hai visualizzato il prompt o eliminato accidentalmente l'intestazione di bridging, aggiungi un nuovo file .h al progetto e <#YourProjectName#>-Bridging-Header.h nome <#YourProjectName#>-Bridging-Header.h

In alcune situazioni, in particolare quando si lavora con i framework ObjC, non si aggiunge esplicitamente una classe Objective-C e Xcode non trova il linker. In questo caso, crea il tuo file .h chiamato come sopra menzionato, quindi assicurati di collegare il suo percorso nelle impostazioni del progetto del tuo target in questo modo:

inserisci la descrizione dell'immagine qui

Nota

È consigliabile collegare il progetto usando la macro $(SRCROOT) modo che se si sposta il progetto o si lavori con altri utilizzando un repository remoto, funzionerà comunque. $(SRCROOT) può essere pensato come la directory che contiene il tuo file .xcodeproj. Potrebbe assomigliare a questo:

$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h

Passaggio 3: aggiungere l'intestazione Objective-C - .h

Aggiungi un altro file .h e CustomObject.h

Step 4: Costruisci 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: aggiungi classe a Bridging-Header

In YourProject-Bridging-Header.h :

#import "CustomObject.h"

Passaggio 6: utilizza il tuo oggetto

In SomeSwiftFile.swift :

var instanceOfCustomObject: CustomObject = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
println(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()

Non c'è bisogno di importare esplicitamente, questo è ciò che l'header bridging è per.

Utilizzo delle classi Swift in Objective-C

Passaggio 1: crea una nuova classe Swift

Aggiungi un file .swift al tuo progetto e 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
    }

}

Passaggio 2: importa i file Swift alla 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 puoi vederlo.

Step 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 someFunction:@"Arg"];
NSLog(@"RetString: %@", retString);

Nota:

1. CodeCompletion non si comportava in modo accurato come mi piacerebbe. Sul mio sistema, l'esecuzione di una build rapida con "cmd + r" sembrava aiutare Swift a trovare alcuni codici Objc e viceversa.

2. Se aggiungi .swift file .swift a un progetto precedente e ottieni l'errore: dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib , prova a riavviare completamente Xcode.

3. Mentre inizialmente era possibile utilizzare le classi pure di Swift in Objective-C usando il prefisso @objc , dopo Swift 2.0, questo non è più possibile. Vedi la cronologia delle modifiche per la spiegazione originale. Se questa funzionalità viene riattivata nelle future versioni di Swift, la risposta verrà aggiornata di conseguenza.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow