Integrando Swift y Objective-C

27
Swift + Obj-C Erick Camacho <@ecamacho>

description

Charla del NSCoder Swift impartida en el DF en octubre de 2014. Tips y experiencias integrando Swift en proyectos iOS que ya usaban Objective-c

Transcript of Integrando Swift y Objective-C

Page 1: Integrando Swift y Objective-C

Swift + Obj-CErick Camacho <@ecamacho>

Page 2: Integrando Swift y Objective-C

Erick Camacho

» Programo desde hace ~ 10 años

» Programo para iOS desde hace 4

» Actualmente:

nubleer.com

Page 3: Integrando Swift y Objective-C

Swift

» Interoperable con Obj-C

» Permite dos estrategias:

1.Ir traduciendo tu proyecto Obj-c poco a poco a Swift

2.Combinar código/librerías legadas de Obj-C y lo nuevo hacerlo en Swift

Page 4: Integrando Swift y Objective-C
Page 5: Integrando Swift y Objective-C

Interoperabilidad a nivel del lenguaje

Page 6: Integrando Swift y Objective-C

Inicializadores

//Obj-C UIViewController *viewController = [[UIViewController alloc] initWithNibName:@"Nib" bundle:nil];

//swift let viewController = UIViewController(nibName: "nibName", bundle: nil)

Page 7: Integrando Swift y Objective-C

Properties

//Obj-C@interface LegacyModel : NSObject

@property (nonatomic, strong) NSString *name;

@end

LegacyModel model = [[LegacyModel alloc] init];model.name = @"nombre";[model setName:@"nombre"];

//swiftvar model = LegacyModel()model.name = "nombre"

Page 8: Integrando Swift y Objective-C

String se convierte a NSString

NSString tiene la propiedad capitalizedString, en Swift lo podemos usar en 'String's

let s:String = "abc"println("En mayúsculas \(s.capitalizedString)")

Page 9: Integrando Swift y Objective-C

NSString tiene que ser 'casteado' a String

String tiene el método toInt(), en Swift solo lo podemos usar en 'NSString's si hacemos un cast explícito

let ns : NSString = "3"let entero : Int = (ns as String).toInt()!println("valor \(entero)")

Page 10: Integrando Swift y Objective-C

Los tipos numéricos se convierten a NSNumber

Sólo para Int, UInt, Float, Double y Bool

let numero : Int = 34let nsnumber : NSNumber = numero

NSInteger y NSUInteger se convierten en Int

let nsinteger : NSInteger = 23let numero : Int = nsinteger

Page 11: Integrando Swift y Objective-C

Colecciones

Los NSArray hacen bridge a un Array:

NSArray -> AnyObject[]

Page 12: Integrando Swift y Objective-C

NSLog Vive!

y casi todas las funciones "C" usadas en Obj-C como CGRectMake(). ¿Cuáles faltan? NSAssert no existe, usen assert

NSLog(!"Mi numero %@", numero)

Aunque es preferible usar println

pritnln("Mi numero \(numero)")

Page 13: Integrando Swift y Objective-C
Page 14: Integrando Swift y Objective-C

Pointers?

Para algunos casos, se definieron tipos Swift para apuntadores.Ejemplo:¿Cómo paso un *NSError?

NSError *error;[myNSData writeToFile:path options:mask error:&error]if(error) {//do something}

Page 15: Integrando Swift y Objective-C

¿Cómo mezclo todo en una app híbrida?

Page 16: Integrando Swift y Objective-C

Usar clases Obj-C en SwiftAgrega un Archivo Swift a tu proyecto Obj-C o viceversa

Page 17: Integrando Swift y Objective-C

Bridge HeaderEncabezado donde deben ir los imports de todas las clases de Obj-C que quieran usar desde Swift.

Page 18: Integrando Swift y Objective-C

Usar clases Swift en Obj-CUn poco más complejo:

1.Asegúrate de tener asignado un "Product Name" a nivel de tu Proyecto

Page 19: Integrando Swift y Objective-C

Usar clases Swift en Obj-C1.La bandera de "Define Modules" debe estar

seleccionada

Page 20: Integrando Swift y Objective-C

Usar clases Swift en Obj-C1.Las clases que quieras usar deben de heredar de

NSObject o ser marcadas con @objc

import UIKit

class SwiftModel : NSObject {

let name : String

init(name : String) { self.name = name }}

Page 21: Integrando Swift y Objective-C

Usar clases Swift en Obj-C1.Si todo sale bien, Xcode generará un .H oculto con

el nombre *<ProductName>-Swift.h que debes de importar en tu clase Obj-C para usar tus clases Swift

#import "LegacyModel.h"#import "SwiftInteroperability-Swift.h"

@implementation LegacyModel

- (void)doSomething{ SwiftModel *swiftModel = [[SwiftModel alloc] initWithName:@"Juan"]; NSLog(@"SwiftModel %@", [swiftModel name]);}

@end

Page 22: Integrando Swift y Objective-C

Usar clases Swift en Obj-CDado que en Obj-C puedes pasar valores nulos a los objetos, recuerda poner tus variables en Swift como Optionals

Page 23: Integrando Swift y Objective-C

¿Y CocoaPods?

Page 24: Integrando Swift y Objective-C

Crea tu PodFilepod 'AFNetworking'

recuerda

pod install

Page 25: Integrando Swift y Objective-C

No olvides importar las cabeceras que necesites en tu Bridge Header#import "LegacyModel.h"#import <AFNetworking/AFNetworking.h>

Page 26: Integrando Swift y Objective-C

Ya puedes usar la librería en Swiftlet manager = AFHTTPRequestOperationManager() manager.GET( "http://api.zippopotam.us/mx/06170", parameters: nil, success: { (operation: AFHTTPRequestOperation!, responseObject: AnyObject!) in println("JSON: " + responseObject.description) }, failure: { (operation: AFHTTPRequestOperation!, error: NSError!) in println("Error: " + error.localizedDescription) })

Page 27: Integrando Swift y Objective-C

Limitaciones de CocoaPodsNo es posible todavía usarlo para importar librerías hechas en Swift en tus proyectos.

CocoaPods va a migrar a usar Dynamic Frameworks y CLang modules para iOS8>.