Devoxx France - Nouvelles du Front

105
Swift : Nouvelles du front

Transcript of Devoxx France - Nouvelles du Front

Page 1: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front

Page 2: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

Fabien Mirault

Speakers

@viteinfinite

Simone Civetta@magici1

Page 3: Devoxx France - Nouvelles du Front

Swift ou pas ?

Page 4: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

Swift ou pas ?

Septembre 2014

Novembre 2014Juin 2014

Apple annonce Swift

Swift 1.0

Première application SwiftXebia sur l’App Store

?

Février 2015

Nouvelles applications ?

Page 5: Devoxx France - Nouvelles du Front

Qu’est-ce que Swift ?

Page 6: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

Qu’est-ce que Swift ?

Nouveau langage de développement

Code plus lisible et moins verbeux

Donc plus simple à maintenir !

Page 7: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

Qu’est-ce que Swift ?

Transition Objective-C → Swift aisée

Moins de tolérance sur les erreurs de programmation

Rapidité de développement accrue

Page 8: Devoxx France - Nouvelles du Front

Swift ou pas ?

Page 9: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

Swift ou pas ?

Juin 2014

Apple annonce Swift

Septembre 2014

Swift 1.0

Novembre 2014

Première application SwiftXebia sur l’App Store

?

Février 2015

Nouvelles applications !

Page 10: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

Swift ou pas ?

Octobre 2014

Swift 1.1

September 2015

Swift 2.0Octobre 2014

Swift 2.1

April 2015

Swift 1.2

Juin 2014

Apple annonce Swift

Septembre 2014

Swift 1.0

Novembre 2014

Première application SwiftXebia sur l’App Store

?

Février 2015

Nouvelles applications !

Mars 2016

Swift 2.2

Page 11: Devoxx France - Nouvelles du Front

Swift c’est cool…

…utilisé dans de vrais projets !

Page 12: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

TOC

Nos cas d’usage

Flux d’activitéCréation du projet et configuration

Produits et synchronisationLanguesCommentairesTesting

Suivre son applicationEt l’Objective-C ?

Page 13: Devoxx France - Nouvelles du Front

Création du projet

Page 14: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

Les dépendances

Librairies dynamiques

Page 15: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRSlide Title

Title

Au revoir iOS 7

Page 16: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

Les dépendances

Page 17: Devoxx France - Nouvelles du Front

Flux d’activités

Page 18: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

Photos et vidéos

Fluidité

Des milliers de posts

Flux d’activités

Page 19: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRFlux d’activités

Struct

Ne contient que ce qui a été défini

Meilleures performances

Stockage de type valeur et non référence

Passage par copie

Page 20: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRFlux d’activités

struct  Attachment  {          let  id:  Int          let  url:  String          let  type:  String          let  name:  String          let  objectId:  Int          let  mimeType:  String          let  objectType:  String  }

Flux d’activitésExemple de Struct

Page 21: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRFlux d’activités

Struct : Performances

Avec une méthode de shuffle sur 1.000.000 d’objets

Seco

ndes

0

0,325

0,65

0,975

1,3

NSObject Struct

0,064

1,152

Page 22: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRFlux d’activités

Struct VS Classes

Ne peut pas hériter d’objets

Pas de deinitializer

Référence unique d’une instance

Page 23: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRFlux d’activités

JSON -> Struct

func  buildUser(jsonData:[String:  AnyObject])  -­‐>  User?  {                    if  let  userData  =  jsonData["user"]  as?  [String:  AnyObject]  {                  return  User(id:  userData["id"]!,                                          firstname:  userData["firstname"]!,                                          lastname:  userData["lastname"]!)          }                    return  nil  }

Page 24: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRFlux d’activités

Unbox

Conversion automatique

Génère des structs

Performances accrues

Page 25: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRFlux d’activités

Unbox par l’exemple

func  buildUser(userData:[String:  AnyObject])  -­‐>  User?  {                    let  user:  User  =  Unbox(userData)          ...                    return  user  }

Page 26: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRFlux d’activités

Performances

StructHéritage Rendu

Page 27: Devoxx France - Nouvelles du Front

Configurations

Page 28: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

Analytics

Endpoints

Regroupement

Configurations

Profil

Page 29: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRConfigurations

Toujours les Structs !

struct  Tags  {          struct  Page  {                  static  let  Login  =  "Login"                  static  let  Camera  =  "Camera"                  static  let  Newsfeed  =  "Newsfeed"                  static  let  Favorites  =  "Favorites"                  static  let  MyProfile  =  "MyProfile"          }  }  

Tags.Page.Login  //  Login

Page 30: Devoxx France - Nouvelles du Front

Liste de produits

Page 31: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

600.000+ lignes

Requêtes rapides

Liste de produits

Page 32: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRListe de produits

Stockage : Objective-C@implementation  XBEntityStore  

-­‐  (void)addEntity:(id<XBEntity>)entity  {          //  Some  implementation  }  

@end  ...

Un peu d’Objective-C

-­‐  (void)addSomeObjects  {                    XBEntityStore  *productStore  =  [XBEntityStore  new];                    //  XBProduct  conforms  to  XBEntity          XBProduct  *product  =  [XBProduct  new];          [productStore  addEntity:product];  }

Page 33: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRListe de produits

Stockage : Objective-C@implementation  XBEntityStore  

-­‐  (void)addEntity:(id<XBEntity>)entity  {          //  Some  implementation  }  

@end  ...

Un peu d’Objective-C

-­‐  (void)addSomeObjects  {                    XBEntityStore  *productStore  =  [XBEntityStore  new];                    //  XBProduct  conforms  to  XBEntity          XBProduct  *product  =  [XBProduct  new];          [productStore  addEntity:product];                    //  XBColor  conforms  to  XBEntity          XBColor  *color  =  [XBColor  new];          [productStore  addEntity:color];  }

Page 34: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRListe de produits

Generics

class  EntityStore<T:  Entity>  {          func  addEntity(entity:  T)  {                  //  Some  implementation          }  }  

...  

func  addSomeObjects()  {          let  productStore  =  EntityStore<Product>()                    //  Product  conforms  to  Entity          let  product  =  Product()          productStore.addEntity(product)                    //  Color  conforms  to  Entity          let  color  =  Color()          productStore.addEntity(color)  }

func  addSomeObjects()  {          let  productStore  =  EntityStore<Product>()                    //  Product  conforms  to  Entity          let  product  =  Product()          productStore.addEntity(product)                    //  Color  conforms  to  Entity          let  color  =  Color()          productStore.addEntity(color)  }

Un peu de Swift

Page 35: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRListe de produits

Generics

Écrire du code facilement réutilisable

et sujet à des contraintes spécifiques

Page 36: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRListe de produits

TypeAlias

typealias  ProductStore  =  EntityStore<Product>  

func  addSomeObjects()  {          let  productStore  =  ProductStore()                  //  ...  }  

Code plus expressif

Page 37: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRListe de produits

Protocols

Swift est un “langage orienté protocoles”Apple, 2015

protocol  Loadable  {          static  func  load(id:  String)  -­‐>  Self?  }

Page 38: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

Protocols

protocol  Loadable  {          static  func  load(id:  String)  -­‐>  Self?  }  

class  Product  :  Loadable  {          static  func  load(id:  String)  -­‐>  Self?  {                  //  Open  the  default  database  store                  //  Look  for  the  id                  //  etc          }  }

Liste de produits

Page 39: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRListe de produits

Protocols

protocol  Loadable  {          static  func  load(id:  String)  -­‐>  Self?  }  

class  Color  :  Loadable  {          static  func  load(id:  String)  -­‐>  Self?  {                  //  Open  the  default  database  store                  //  Look  for  the  id                  //  etc          }  }

Page 40: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRListe de produits

Protocols Extensions

protocol  Loadable  {          static  func  load(id:  String)  -­‐>  Self?  }  

extension  Loadable  {          static  func  load(id:  String)  -­‐>  Self?  {                  //  Open  the  default  database  store                  //  Look  for  the  id                  //  etc          }  }

Page 41: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRListe de produits

Protocols Extensions

protocol  Loadable  {          static  func  load(id:  String)  -­‐>  Self?  }  

extension  Loadable  {          static  func  load(id:  String)  -­‐>  Self?  {                  //  ...          }  }

class  Product  :  Loadable  {  /*  ...  */  }  

class  Color  :  Loadable  {  /*  ...  */  }

Page 42: Devoxx France - Nouvelles du Front

Synchronisation

Page 43: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

Synchronisation etmanipulation500 Mo de données

Performances

Synchronisation

Page 44: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRSynchronisation

Performances

déclarations final et static

Profiter pleinement du runtime de Swift

Page 45: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRSynchronisation

Performances

Attention aux casts entre Array ↔ NSArray

Dictionary ↔ NSDictionary

Page 46: Devoxx France - Nouvelles du Front

Tâches asynchrones

Page 47: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

Librairie locale

Tâches asynchrones

Ecran personnalisé

Animation diaphragme

Appareil photo

Page 48: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRTâches asynchrones

Closure

Equivalent des blocks en Objective-C

Comprend un bloc de code à exécuter

Définition : {  ()  -­‐>  ()  in  }

Page 49: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRTâches asynchrones

Exemple de closure

self.closeDiaphragm  {  _  in          self.openDiaphragm()  }

Page 50: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRTâches asynchrones

Optionals

Possède une valeur ou non

Rend le code plus expressif

Tester la non nullité : guard  let

Définition : var  delegate:CameraDelegate?

Page 51: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRTâches asynchrones

Exemple d’optionals

func  setup(image:UIImage?)  {          guard  let  menuIcon  =  image  else  {  return  }          let  menuImageView  =  UIImageView(image:  menuIcon)          self.addSubview(menuImageView)  }

Page 52: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRTâches asynchrones

Optionals : fiabilité !

Source : DevFee (Developers feeling)

Page 53: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

Appels asynchrones

Tâches asynchrones

Sur n’importe quel post

Gestion des retours serveur

Poster un commentaire

Page 54: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRTâches asynchrones

Promise

Code plus lisible

Idéal pour les tâches asynchrones

Chaînage possible

Page 55: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRTâches asynchrones

Exemple de Promise

       //  Parameters                  var  parameters  =  Parameters()                  parameters["content"]  =  view.textView.text                                    PostRequest.getHeaders()  

       .success  {  token  in                              return  PostRequest.postContent(token,  parameters)                      }                      .success  {  data  in                            sendComplete()                      }  

       .failure  {  (error,  isCancelled)  -­‐>  Void  in                              sendFailed()                      }

Page 56: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRTâches asynchrones

Sans Promise

   //  Parameters                  var  parameters  =  Parameters()                  parameters["content"]  =  view.textView.text                                  PostRequest.getHeaders()  {  [weak  self]  (token:  String,  error:  NSError)  -­‐>  Void  in                                  if  token  !=  nil  {                                        PostRequest.postContent(token,  parameters)  {  [weak  self]  (result:  Bool,  error:  NSError)  -­‐>  Void  in  

                               if  result  ==  true  {                                                  if  let  strongSelf  ==  self  {                                                                        strongSelf.sendComplete()                                                  }                                  }  else  {                                                  if  let  strongSelf  ==  self  {                                                                        strongSelf.sendFailed()                                                  }                                  }                    }              }  else  {                          if  let  strongSelf  ==  self  {                                  strongSelf.sendFailed()                          }              }  }  

                       

Page 57: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

SwiftTasks

Une des librairies principales

Mise en place simple…

…mais des erreurs dans Xcode

Page 58: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRTâches asynchrones

Erreurs avec Xcode

       if  let  colorsFilePath  =  syncDataConfiguration.colorsFile,  data  =  NSData(contentsOfFile:colorsFilePath)  {        MetadataJSONDeserializer.deserialize(data,  keyPath:  "colors.color")                .success  {  color  -­‐>  ColorDuplicateRemovalTask  in                        return  self.removeDuplicateIdentifiers(colors)                }                .success  {  colors  -­‐>  JSONInsertTask  in                        return  entityStore.replaceAllObjects(colors,  transformer:  Color.tranform)                }                .success  {  JSONs  -­‐>  Void  in                        taskTuple.fulfill(JSONs)                }                .failure  {  (error,  isCancelled)  in                      if  let  error  =  error  {                            taskTuple.reject(error)                      }                }  

     return  taskTuple.task  }  

Page 59: Devoxx France - Nouvelles du Front

Disponibilité produit

Page 60: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

Simple requête HTTP

Mise à jour de la UI

Disponibilité produit

Page 61: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRDisponibilité produit

Les étapes

Récupération

Déserialisation

UI

Page 62: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRDisponibilité produit

Functional Reactive Programming

Propagation de messages

Asynchronisme

Robustesse

Page 63: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRDisponibilité produit

Functional Reactive Programming

^{  available  in                    guard  let  available  =  available  as?  Bool  else  {  return  }          availabilitySpinner.stopAnimating()          availabilityIndicator.textColor  =  colorForStatus(available)            }  <~  KVO.stream(viewModel,  "status")

Page 64: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

ReactiveCocoa

github.com/ReactiveCocoa/

Disponibilité produit

Page 65: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

ReactKit

github.com/ReactKit/

Disponibilité produit

Page 66: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

     [[[RACObserve(viewModel.status)                  map:^id(NSString  *status)  {                          if  ([status  isKindOfClass:[NSString  class]])  {                                  return  status;                          }                          return  nil;                  }]                  map:^id(NSString  *status)  {                          return  @([status  isEqualToString:@"available"]);                  }]                  delay:1.0];  

     [[[RACObserve(viewModel.status)                  map:^id(NSString  *status)  {                          if  ([status  isKindOfClass:[NSString  class]])  {                                  return  status;                          }                          return  nil;                  }]                  map:^id(NSString  *status)  {                          return  @([status  isEqualToString:@"available"]);                  }]                  delay:1.0];  

FRP - Objective-C

Disponibilité produit

Page 67: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

FRP - Swift

               let  availabilitySignal  =  KVO.signal(viewModel,  "status")                          .map  {  status  -­‐>  String?  in                                  return  status  as?  String                          }                          .map  {  status  -­‐>  Bool  in                                  return  status  ==  "available"                          }                          .delay(1.0)

Disponibilité produit

Page 68: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRDisponibilité produit

Opérateurs Custom^{  available  in                    guard  let  available  =  available  as?  Bool  else  {  return  }          availabilitySpinner.stopAnimating()          availabilityIndicator.textColor  =  colorForStatus(available)            }  <~  KVO.stream(viewModel,  "status")<~

Page 69: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRSlide Title

Title

Page 70: Devoxx France - Nouvelles du Front

Internationalisation

Page 71: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

Changement de la langue

Traduction des contenus

Traduction de l’IHM

Internationalisation

Page 72: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRInternationalisation

Enumsenum  Country  {  

       case  USA          case  China          case  Italy  

}  

Et finalement du Swift

Page 73: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRInternationalisation

Enumsenum  Country  {  

       case  USA          case  China          case  Italy  

       static  var  preferred:  Country  {                  return  Country.Italy          }  

}  

Country.preferred  //  .Italy  

Et finalement du Swift

Valeurs associées

Page 74: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRInternationalisation

Enumsenum  Country:  String  {  

       case  USA          case  Italy                    var  name:  String  {                  switch  self  {                  case  USA:                          return  "United  States"                  case  Italy:                          return  "Italia!"                  }          }  }  

Country.Italy.name  //  .Italia!  

Et finalement du Swift

Propriétés

Page 75: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRInternationalisation

Switchenum  Language  {  

       case  English          case  Italian          //  ...  

       var  language:  String  {                  switch  self  {                  //  ...                  }          }  }  

Swift

Page 76: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRInternationalisation

Switchenum  Language  {  

       case  English(country:  Country)          case  Italian  

       var  language:  String  {                  switch  self  {                  case  .English(let  country):                          return  "English  \(country.name)"                  //  ...          }  }  

Language.English(country:  .USA).name  //  English  (United  States)

Swift

Value binding

Page 77: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRInternationalisation

Enums : it’s over 9000!!!

First-Class types

Méthodes et propriétés

Vérifiés à la compilation

Valeurs associées

Page 78: Devoxx France - Nouvelles du Front

Tests

Page 79: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

Assurer le fonctionnementde l’application

Se protéger des régressions

Tests

Page 80: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRTests

Chargement des produits

Product.load("A00")

Comment tester ?

Page 81: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRSlide Title

Protocols Extensions

protocol  Loadable  {          static  func  load(id:  String)  -­‐>  Self?  }  

extension  Loadable  {          static  func  load(id:  String)  -­‐>  Self?  {                  //  Open  the  default  database  store                  //  Look  for  the  id                  //  etc          }  }

Page 82: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRSlide Title

Protocols Extensions

protocol  Loadable  {          static  func  load(id:  String,  store:  Store)  -­‐>  Self?  }  

extension  Loadable  {          static  func  load(id:  String,  store:  Store  =  Stores.DefaultStore)  -­‐>  Self?  {                  //  Open  the  default  database  store                  //  Look  for  the  id                  //  etc          }  }

Page 83: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

func  testDoSomething()  {                    //  Setup          let  mockStore  =  Store(products:  [Product(id:  "A00")])                    //  Run          let  product  =  Product.load("A00",  store:  mockStore)                    //  Verify          XCTAssertNotNil(product)  }

Tests

Chargement des produits

Product.load("A00")

Page 84: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRListe de produits

Swift VS Swiftclass  Store  {          func  addEntity(entity:  Product)  {                  //  Some  implementation          }  }  

let  entityStore  =  EntityStore()  let  product  =  Product()  entityStore.addEntity(product)

Coder Swift != Penser Swift

class  Store<T:  Entity>  {          func  addEntity(entity:  T)  {                  //  Some  implementation          }  }  

let  productStore  =  ProductStore()  let  product  =  Product()  product.save(productStore)

Generics

Typealias

Protocol extensions

Page 85: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRSlide Title

Title

#DevoxxFRSwift : Nouvelles du front

Page 86: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRSlide Title

Title

#DevoxxFRSwift : Nouvelles du front

Page 87: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRTests

Mais aussi…

Page 88: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRFlux d’activités

Flux d’activitésCrash

Page 89: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRTests

Mais aussi…

Page 90: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRTests

Mais aussi…

Page 91: Devoxx France - Nouvelles du Front

Suivre son application

Page 92: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRSuivre son application

Fabric

Déploiement centralisé et versionné

Remontées de crashs

Statistiques d’utilisation

Page 93: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

Fabric - Objective-C

RTSViewController.m  line  1310  -­‐[RTSViewController  getCurrentUDPValues]

Fatal  Exception:  NSRangeException  ***  -­‐[__NSArrayM  objectAtIndex:]    index  4294967292  beyond  bounds  [0  ..  511]

Suivre son application

Page 94: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

Fabric - Swift

WSClient.swift  line  31  static  MyLittlePony.WSClient.requestContent  (MyLittlePony.WSClient.Type)  parameters  :  Swift.Optional  <Swift.Dictionary  <Swift.String,  Swift.AnyObject>

Crashed:  com.apple.main-­‐thread  SIGABRT  ABORT  at  0x312a8df0

Suivre son application

Page 95: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFRSuivre son application

Pourquoi ?

Évolution du langage constante

Rétrocompatibilité non assurée

Page 96: Devoxx France - Nouvelles du Front

Et l’Objective-C ?

Page 97: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

Et l’Objective-C dans tout ça ?

Toujours valable

Mais développement plus lent

Migration progressive conseillée

Page 98: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

Popu

larit

é de

s re

cher

ches

2014 2015 2016Objective-C Swift Objective-C Swift Objective-C Swift

Source : TIOBE

3 ème

19 ème

14 ème

15 ème 15 ème

14 ème

Et l’Objective-C dans tout ça ?

Page 99: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

Les avantages de Swift

Plus facile à maintenir et plus robuste

Demande moins de code

Ouverture vers du développement back

Soyez acteur des évolutions d’Apple !

Page 100: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

Page 101: Devoxx France - Nouvelles du Front

One more thing…

Page 102: Devoxx France - Nouvelles du Front
Page 103: Devoxx France - Nouvelles du Front

23-24 septembre

frenchkit.frBillets en vente dès aujourd’hui

CocoaHeads Paris

Page 104: Devoxx France - Nouvelles du Front

Rejoignez-nous [email protected]

blog.xebia.fr

Page 105: Devoxx France - Nouvelles du Front

Swift : Nouvelles du front#Xebia #DevoxxFR

Un peu de lecture

A Swift KickstartDaniel Steinberg

Functional Programming in SwiftChris Eidhof, Florian Kugler, and Wouter Swierstra

http://blog.xebia.fr/tag/swiftL’équipe iOS Xebia

Advanced SwiftChris Eidhof and Airspeed Velocity