Post on 21-Jun-2015
description
Swift + Obj-CErick Camacho <@ecamacho>
Erick Camacho
» Programo desde hace ~ 10 años
» Programo para iOS desde hace 4
» Actualmente:
nubleer.com
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
Interoperabilidad a nivel del lenguaje
Inicializadores
//Obj-C UIViewController *viewController = [[UIViewController alloc] initWithNibName:@"Nib" bundle:nil];
//swift let viewController = UIViewController(nibName: "nibName", bundle: nil)
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"
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)")
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)")
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
Colecciones
Los NSArray hacen bridge a un Array:
NSArray -> AnyObject[]
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)")
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}
¿Cómo mezclo todo en una app híbrida?
Usar clases Obj-C en SwiftAgrega un Archivo Swift a tu proyecto Obj-C o viceversa
Bridge HeaderEncabezado donde deben ir los imports de todas las clases de Obj-C que quieran usar desde Swift.
Usar clases Swift en Obj-CUn poco más complejo:
1.Asegúrate de tener asignado un "Product Name" a nivel de tu Proyecto
Usar clases Swift en Obj-C1.La bandera de "Define Modules" debe estar
seleccionada
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 }}
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
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
¿Y CocoaPods?
Crea tu PodFilepod 'AFNetworking'
recuerda
pod install
No olvides importar las cabeceras que necesites en tu Bridge Header#import "LegacyModel.h"#import <AFNetworking/AFNetworking.h>
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) })
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>.