objective-c - objective - swift programming




Come chiamare il codice Objective-C da Swift (10)

Nel nuovo linguaggio Swift di Apple, come si chiama il codice Objective-C?

Apple ha affermato che potrebbero coesistere in un'unica applicazione, ma ciò significa che si potrebbero riutilizzare tecnicamente le vecchie classi create in Objective-C mentre si costruiscono nuove classi in Swift?

Il ragionamento

Objective-C è un linguaggio indipendente dalla piattaforma, mentre Swift è dipendente dalla piattaforma. La scrittura di codice non dipendente dalla piattaforma (business logic library) in Swift non sarebbe quindi saggia. Tuttavia, scrivere codice dipendente dalla piattaforma (ad esempio l'interfaccia) andrebbe perfettamente bene. Per non dire che sarebbe una buona idea, tuttavia è sicuramente un interesse.


Utilizzo delle classi Objective-C in Swift

** Se hai una lezione esistente che desideri utilizzare, esegui il passaggio 2 e quindi vai al passaggio 5 . (In alcuni casi, ho dovuto aggiungere un #import <Foundation/Foundation.h esplicito #import <Foundation/Foundation.h a un vecchio file Objective-C.) **

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:

Clicca !

Se non hai visualizzato il prompt, o hai accidentalmente cancellato l'intestazione del bridging, aggiungi un nuovo file .h al progetto e <#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 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:

Nota

È consigliabile collegare il progetto utilizzando la macro $(SRCROOT) modo che se si sposta il progetto o si lavori su 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 è necessario importare esplicitamente; questo è l'intestazione del bridging.

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 dei codici Objective-C e viceversa.

2. Se aggiungi un 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.


Un'altra cosa che vorrei aggiungere qui:

Sono molto grato alla risposta di @ Logan. Aiuta molto a creare un file bridge e le impostazioni.

Ma dopo aver fatto tutti questi passaggi non riesco ancora a ottenere una classe Objective-C in Swift.

Ho usato la libreria cocoapods e l' cocoapods integrata nel mio progetto. Che è pod "pop" .

Quindi se stai usando i contenitori Objective-C in Swift, potrebbe esserci la possibilità che tu non possa ottenere o import le classi in Swift.

La cosa semplice che devi fare è:

  1. Vai a <YOUR-PROJECT>-Bridging-Header file e
  2. Sostituisci l'istruzione #import <ObjC_Framework> in @import ObjC_Framework

Ad esempio: (libreria pop)

Sostituire

#import <pop/POP.h>

con

@import pop;

Usa clang import quando #import non funziona.


Citazione dalla documentazione :

Qualsiasi framework Objective-C (o libreria C) accessibile come modulo può essere importato direttamente in Swift. Ciò include tutti i framework di sistema Objective-C, come Foundation, UIKit e SpriteKit, nonché le librerie C comuni fornite con il sistema. Ad esempio, per importare Foundation, è sufficiente aggiungere questa istruzione import nella parte superiore del file Swift su cui si sta lavorando:

import Foundation

Questa importazione rende tutte le API Foundation, inclusi NSDate, NSURL, NSMutableData e tutti i relativi metodi, proprietà e categorie, direttamente disponibili in Swift.


Consulta la guida di Apple sull'utilizzo di Swift con Cocoa e Objective-C . Questa guida spiega come utilizzare il codice Objective-C e C di Swift e viceversa e contiene consigli su come convertire un progetto o combinare parti Objective-C / C e Swift in un progetto esistente.

Il compilatore genera automaticamente la sintassi Swift per chiamare le funzioni C e i metodi Objective-C. Come visto nella documentazione, questo Objective-C:

UITableView *myTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];

si trasforma in questo codice Swift:

let myTableView: UITableView = UITableView(frame: CGRectZero, style: .Grouped)

Xcode esegue anche questa traduzione al volo: puoi utilizzare Apri rapidamente durante la modifica di un file Swift e digitare un nome di classe Objective-C, e ti porterà a una versione di Swift dell'header della classe. (Puoi anche ottenere questo facendo cmd-clic su un simbolo API in un file Swift.) E tutta la documentazione di riferimento dell'API nelle librerie di sviluppatori iOS 8 e OS X v10.10 (Yosemite) è visibile sia in Objective-C che in Swift forme (ad es. UIView ).


Ecco le istruzioni passo passo per l'utilizzo del codice Objective-C (in questo caso, un framework fornito da una terza parte) in un progetto Swift:

  1. Aggiungi qualsiasi file Objective-C al tuo progetto Swift scegliendo File -> Nuovo -> Nuovo file -> File Objective-C. Al momento del salvataggio, Xcode chiederà se si desidera aggiungere un'intestazione di bridging . Scegli " ". Gif: aggiunta del file vuoto al progetto e generazione dell'intestazione di bridging http://www.derrrick.com//1-empty-file.gif

In semplici passaggi:

  1. Viene visualizzato un prompt, quindi fai clic su OK ... Se non viene visualizzato, lo creiamo manualmente come nel seguente ... Crea un file di intestazione dal sorgente iOS e assegna il nome ProjectName-Bridging-Header (esempio: Test -Bridging-Header), e poi vai a costruire le impostazioni nel codice del compilatore Swift -> Objective-C bridge aggiungi il nome del bridge Objective-C .. (Test / Test-Bridging-Header.h). Sì, è completo.

  2. Facoltativamente, elimina il file Objective-C che hai aggiunto (denominato "qualsiasi cosa" nell'immagine GIF sopra). Non ne hai più bisogno.

  3. Apri il file di intestazione del bridging : il nome del file è del modulo [YourProject] -Bridging-Header.h . Include un commento fornito da Xcode. Aggiungi una riga di codice per il file Objective-C che desideri includere , ad esempio un framework di terze parti. Ad esempio, per aggiungere Mixpanel al tuo progetto, dovrai aggiungere la seguente riga di codice al file di intestazione del bridging:

    #import "Mixpanel.h"
  4. Ora, in qualsiasi file Swift puoi usare il codice Objective-C esistente, nella sintassi Swift (nel caso di questo esempio, e puoi chiamare i metodi SDK di Mixpanel, ecc.). Hai bisogno di familiarizzare con il modo in cui Xcode traduce Objective-C in Swift. La guida di Apple è una lettura veloce. Oppure vedi questa risposta per un riassunto incompleto.

Esempio per Mixpanel:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    Mixpanel.sharedInstanceWithToken("your-token")
    return true
}

Questo è tutto!

Nota: se rimuovi il file di intestazione di bridging dal progetto , assicurati di andare in Impostazioni di compilazione e rimuovere il valore per " Intestazione di Bridging Objective-C " in "Compilatore Swift - Generazione di codice".


Fai clic sul menu Nuovo file e scegli il file seleziona lingua Obiettivo. A quel tempo genera automaticamente un file "Objective-C Bridging Header" che viene utilizzato per definire un nome di classe.

"Objective-C Bridging Header" in "Swift Compiler - Code Generation".


Puoi leggere il bel post Swift & Cocoapods . Fondamentalmente, abbiamo bisogno di creare un file di intestazione per bridging e mettere lì tutte le intestazioni di Objective-C. E poi dobbiamo fare riferimento alle nostre impostazioni di compilazione. Dopodiché, possiamo usare il codice Objective-C.

let manager = AFHTTPRequestOperationManager()
manager.GET(
  "http://example.com/resources.json",
  parameters: nil,
  success: { (operation: AFHTTPRequestOperation!,
              responseObject: AnyObject!) in
      println("JSON: " + responseObject.description)
  },
  failure: { (operation: AFHTTPRequestOperation!,
              error: NSError!) in
      println("Error: " + error.localizedDescription)
  })

Dai anche un'occhiata al documento di Apple usando anche Swift con Cocoa e Objective-C .


Qualsiasi framework Objective-C (o libreria C) accessibile come modulo può essere importato direttamente in Swift. Ciò include tutti i framework di sistema Objective-C, come Foundation, UIKit e SpriteKit, nonché le librerie C comuni fornite con il sistema. Ad esempio, per importare Foundation, è sufficiente aggiungere questa istruzione import nella parte superiore del file Swift su cui si sta lavorando:

import Foundation

Questa importazione rende tutte le API Foundation, inclusi NSDate, NSURL, NSMutableData e tutti i relativi metodi, proprietà e categorie, direttamente disponibili in Swift.

Ho preso questo dalla documentazione di Apple.



Approccio bidirezionale per usare obiettivo-c obiettivo-c

1

1. Create bridge-header.h file in Xcode Project
2. import .h file in bridge-Header file
3. Set path of bridge-Header in Build settings. 
3. Clean the Project 

2

  1. Create objective-c files in project(it automatically set path in Build Settings for you )
  2. import .h file in bridge-Header file

Adesso è bello andare Grazie





swift