SlideShare une entreprise Scribd logo
1  sur  105
Télécharger pour lire hors ligne
Swift : Nouvelles du front
Swift : Nouvelles du front
#Xebia #DevoxxFR
Fabien Mirault
Speakers
@viteinfinite
Simone Civetta
@magici1
Swift ou pas ?
Swift : Nouvelles du front
#Xebia #DevoxxFR
Swift ou pas ?
Septembre 2014
Novembre 2014Juin 2014
Apple annonce Swift
!
Swift 1.0
!
Première application Swift
Xebia sur l’App Store
?
Février 2015
Nouvelles applications ?
Qu’est-ce que Swift ?
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 !
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
Swift ou pas ?
Swift : Nouvelles du front
#Xebia #DevoxxFR
Swift ou pas ?
Juin 2014
Apple annonce Swift
!
Septembre 2014
Swift 1.0
Novembre 2014
!
Première application Swift
Xebia sur l’App Store
?
Février 2015
Nouvelles applications !
Swift : Nouvelles du front
#Xebia #DevoxxFR
Swift ou pas ?
Octobre 2014
Swift 1.1
September 2015
Swift 2.0
Octobre 2014
Swift 2.1
April 2015
Swift 1.2
Juin 2014
Apple annonce Swift
!
Septembre 2014
Swift 1.0
Novembre 2014
!
Première application Swift
Xebia sur l’App Store
?
Février 2015
Nouvelles applications !
Mars 2016
Swift 2.2
Swift c’est
cool…
…utilisé dans
de vrais
projets !
Swift : Nouvelles du front
#Xebia #DevoxxFR
TOC
Nos cas d’usage
Flux d’activité
Création du projet et configuration
Produits et synchronisation
Langues
Commentaires
Testing
Suivre son application
Et l’Objective-C ?
Création du projet
Swift : Nouvelles du front
#Xebia #DevoxxFR
Les dépendances
Librairies dynamiques
Swift : Nouvelles du front
#Xebia #DevoxxFRSlide Title
Title
Au revoir iOS 7
Swift : Nouvelles du front
#Xebia #DevoxxFR
Les dépendances
Flux d’activités
Swift : Nouvelles du front
#Xebia #DevoxxFR
Photos et vidéos
Fluidité
Des milliers de posts
Flux d’activités
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
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és
Exemple de Struct
Swift : Nouvelles du front
#Xebia #DevoxxFRFlux d’activités
Struct : Performances
Avec une méthode de shuffle sur 1.000.000 d’objets
Secondes
0
0,325
0,65
0,975
1,3
NSObject Struct
0,064
1,152
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
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	
  
}
Swift : Nouvelles du front
#Xebia #DevoxxFRFlux d’activités
Unbox
Conversion automatique
Génère des structs
Performances accrues
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	
  
}
Swift : Nouvelles du front
#Xebia #DevoxxFRFlux d’activités
Performances
Struct
Héritage Rendu
Configurations
Swift : Nouvelles du front
#Xebia #DevoxxFR
Analytics
Endpoints
Regroupement
Configurations
Profil
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
Liste de produits
Swift : Nouvelles du front
#Xebia #DevoxxFR
600.000+ lignes!
Requêtes rapides!
Liste de produits
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];	
  
}
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];	
  
}
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
Swift : Nouvelles du front
#Xebia #DevoxxFRListe de produits
Generics
Écrire du code facilement réutilisable
et sujet à des contraintes spécifiques
Swift : Nouvelles du front
#Xebia #DevoxxFRListe de produits
TypeAlias
typealias	
  ProductStore	
  =	
  EntityStore<Product>	
  
func	
  addSomeObjects()	
  {	
  
	
  	
  	
  	
  let	
  productStore	
  =	
  ProductStore()	
  	
  	
  	
  	
  
	
  	
  	
  	
  //	
  ...	
  
}	
  
Code plus expressif
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?	
  
}
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
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	
  
	
  	
  	
  	
  }	
  
}
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	
  
	
  	
  	
  	
  }	
  
}
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	
  {	
  /*	
  ...	
  */	
  }
Synchronisation
Swift : Nouvelles du front
#Xebia #DevoxxFR
Synchronisation et
manipulation
500 Mo de données
!
Performances!
Synchronisation
Swift : Nouvelles du front
#Xebia #DevoxxFRSynchronisation
Performances
déclarations final et static
Profiter pleinement du runtime de Swift
Swift : Nouvelles du front
#Xebia #DevoxxFRSynchronisation
Performances
Attention aux casts entre
Array ↔ NSArray
Dictionary ↔ NSDictionary
Tâches asynchrones
Swift : Nouvelles du front
#Xebia #DevoxxFR
Librairie locale
Tâches asynchrones
Ecran personnalisé
Animation diaphragme
Appareil photo
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	
  }
Swift : Nouvelles du front
#Xebia #DevoxxFRTâches asynchrones
Exemple de closure
self.closeDiaphragm	
  {	
  _	
  in	
  
	
  	
  	
  	
  self.openDiaphragm()	
  
}
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?
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)	
  
}
Swift : Nouvelles du front
#Xebia #DevoxxFRTâches asynchrones
Optionals : fiabilité !
Source : DevFee (Developers feeling)
Swift : Nouvelles du front
#Xebia #DevoxxFR
Appels asynchrones
Tâches asynchrones
Sur n’importe quel post
Gestion des retours serveur
Poster un commentaire
Swift : Nouvelles du front
#Xebia #DevoxxFRTâches asynchrones
Promise
Code plus lisible
Idéal pour les tâches asynchrones
Chaînage possible
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()	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }
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()	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  }	
  
}	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
Swift : Nouvelles du front
#Xebia #DevoxxFR
SwiftTasks
Une des librairies principales
Mise en place simple…
…mais des erreurs dans Xcode
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	
  
}	
  
Disponibilité produit
Swift : Nouvelles du front
#Xebia #DevoxxFR
Simple requête HTTP!
Mise à jour de la UI!
Disponibilité produit
Swift : Nouvelles du front
#Xebia #DevoxxFRDisponibilité produit
Les étapes
Récupération
Déserialisation
UI
Swift : Nouvelles du front
#Xebia #DevoxxFRDisponibilité produit
Functional Reactive Programming
Propagation de messages
Asynchronisme
Robustesse
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")
Swift : Nouvelles du front
#Xebia #DevoxxFR
ReactiveCocoa
github.com/ReactiveCocoa/
Disponibilité produit
Swift : Nouvelles du front
#Xebia #DevoxxFR
ReactKit
github.com/ReactKit/
Disponibilité produit
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
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
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")<~
Swift : Nouvelles du front
#Xebia #DevoxxFRSlide Title
Title
Internationalisation
Swift : Nouvelles du front
#Xebia #DevoxxFR
Changement de la langue!
Traduction des contenus!
Traduction de l’IHM!
Internationalisation
Swift : Nouvelles du front
#Xebia #DevoxxFRInternationalisation
Enums
enum	
  Country	
  {	
  
	
  	
  	
  	
  case	
  USA	
  
	
  	
  	
  	
  case	
  China	
  
	
  	
  	
  	
  case	
  Italy	
  
}	
  
Et finalement du Swift
Swift : Nouvelles du front
#Xebia #DevoxxFRInternationalisation
Enums
enum	
  Country	
  {	
  
	
  	
  	
  	
  case	
  USA	
  
	
  	
  	
  	
  case	
  China	
  
	
  	
  	
  	
  case	
  Italy	
  
	
  	
  	
  	
  static	
  var	
  preferred:	
  Country	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  return	
  Country.Italy	
  
	
  	
  	
  	
  }	
  
}	
  
Country.preferred	
  //	
  .Italy	
  
Et finalement du Swift
Valeurs associées
Swift : Nouvelles du front
#Xebia #DevoxxFRInternationalisation
Enums
enum	
  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
Swift : Nouvelles du front
#Xebia #DevoxxFRInternationalisation
Switch
enum	
  Language	
  {	
  
	
  	
  	
  	
  case	
  English	
  
	
  	
  	
  	
  case	
  Italian	
  
	
  	
  	
  	
  //	
  ...	
  
	
  	
  	
  	
  var	
  language:	
  String	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  switch	
  self	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  //	
  ...	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  }	
  
}	
  
Swift
Swift : Nouvelles du front
#Xebia #DevoxxFRInternationalisation
Switch
enum	
  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
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
Tests
Swift : Nouvelles du front
#Xebia #DevoxxFR
Assurer le fonctionnement
de l’application
Se protéger des régressions
Tests
Swift : Nouvelles du front
#Xebia #DevoxxFRTests
Chargement des produits
Product.load("A00")
Comment tester ?
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	
  
	
  	
  	
  	
  }	
  
}
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	
  
	
  	
  	
  	
  }	
  
}
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")
Swift : Nouvelles du front
#Xebia #DevoxxFRListe de produits
Swift VS Swift
class	
  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
Swift : Nouvelles du front
#Xebia #DevoxxFRSlide Title
Title
#DevoxxFR
Swift : Nouvelles du front
Swift : Nouvelles du front
#Xebia #DevoxxFRSlide Title
Title
#DevoxxFR
Swift : Nouvelles du front
Swift : Nouvelles du front
#Xebia #DevoxxFRTests
Mais aussi…
Swift : Nouvelles du front
#Xebia #DevoxxFRFlux d’activités
Flux d’activités
Crash
Swift : Nouvelles du front
#Xebia #DevoxxFRTests
Mais aussi…
Swift : Nouvelles du front
#Xebia #DevoxxFRTests
Mais aussi…
Suivre son application
Swift : Nouvelles du front
#Xebia #DevoxxFRSuivre son application
Fabric
Déploiement centralisé et versionné
Remontées de crashs
Statistiques d’utilisation
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
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
Swift : Nouvelles du front
#Xebia #DevoxxFRSuivre son application
Pourquoi ?
Évolution du langage constante
Rétrocompatibilité non assurée
Et l’Objective-C ?
Swift : Nouvelles du front
#Xebia #DevoxxFR
Et l’Objective-C dans tout ça ?
Toujours valable
Mais développement plus lent
Migration progressive conseillée
Swift : Nouvelles du front
#Xebia #DevoxxFR
Popularitédesrecherches
2014 2015 2016
Objective-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 ?
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 !
Swift : Nouvelles du front
#Xebia #DevoxxFR
One more thing…
23-24 septembre
frenchkit.fr
Billets en vente dès aujourd’hui
CocoaHeads Paris
Rejoignez-nous !
recrutement@xebia.fr
blog.xebia.fr
Swift : Nouvelles du front
#Xebia #DevoxxFR
Un peu de lecture
A Swift Kickstart

Daniel Steinberg
Functional Programming in Swift

Chris Eidhof, Florian Kugler, and Wouter Swierstra
http://blog.xebia.fr/tag/swift
L’équipe iOS Xebia
Advanced Swift

Chris Eidhof and Airspeed Velocity

Contenu connexe

Tendances

Nouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde MicrosoftNouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde Microsoftdavrous
 
Javascript pour le développeur Java
Javascript pour le développeur JavaJavascript pour le développeur Java
Javascript pour le développeur Javajollivetc
 
Javascript pour les Développeurs WEB
Javascript pour les Développeurs WEBJavascript pour les Développeurs WEB
Javascript pour les Développeurs WEBAbbes Rharrab
 
Du JavaScript dans mon projet
Du JavaScript dans mon projetDu JavaScript dans mon projet
Du JavaScript dans mon projetjollivetc
 
Guide javascript
Guide javascriptGuide javascript
Guide javascriptjollivetc
 
Scalar Types Hints
Scalar Types HintsScalar Types Hints
Scalar Types HintsDarkmira
 
Programmation fonctionnelle
Programmation fonctionnelleProgrammation fonctionnelle
Programmation fonctionnelleJean Detoeuf
 

Tendances (9)

Cours1
Cours1Cours1
Cours1
 
Nouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde MicrosoftNouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde Microsoft
 
Javascript pour le développeur Java
Javascript pour le développeur JavaJavascript pour le développeur Java
Javascript pour le développeur Java
 
La programmation fonctionnelle en javascript / PF
La programmation fonctionnelle en javascript / PFLa programmation fonctionnelle en javascript / PF
La programmation fonctionnelle en javascript / PF
 
Javascript pour les Développeurs WEB
Javascript pour les Développeurs WEBJavascript pour les Développeurs WEB
Javascript pour les Développeurs WEB
 
Du JavaScript dans mon projet
Du JavaScript dans mon projetDu JavaScript dans mon projet
Du JavaScript dans mon projet
 
Guide javascript
Guide javascriptGuide javascript
Guide javascript
 
Scalar Types Hints
Scalar Types HintsScalar Types Hints
Scalar Types Hints
 
Programmation fonctionnelle
Programmation fonctionnelleProgrammation fonctionnelle
Programmation fonctionnelle
 

Similaire à Devoxx France - Nouvelles du Front

Visual Studio 2008 Overview
Visual Studio 2008 OverviewVisual Studio 2008 Overview
Visual Studio 2008 OverviewGregory Renard
 
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0Gregory Renard
 
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0Gregory Renard
 
Patterns and OOP in PHP
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHPjulien pauli
 
Linq et Entity framework
Linq et Entity frameworkLinq et Entity framework
Linq et Entity frameworkDNG Consulting
 
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantHugo Hamon
 
Séminaire Ruby on Rails (novembre 2010)
Séminaire Ruby on Rails (novembre 2010)Séminaire Ruby on Rails (novembre 2010)
Séminaire Ruby on Rails (novembre 2010)Novelys
 
react-slides.ppx (2) (1).pptx react presentation basic
react-slides.ppx (2) (1).pptx react presentation basicreact-slides.ppx (2) (1).pptx react presentation basic
react-slides.ppx (2) (1).pptx react presentation basiczineblahib2
 
ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours
ENIB cours CAI Web - Séance 3 - JSP/Servlet - CoursENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours
ENIB cours CAI Web - Séance 3 - JSP/Servlet - CoursHoracio Gonzalez
 
Initiation au JavaScript
Initiation au JavaScriptInitiation au JavaScript
Initiation au JavaScriptMouna Dhaouadi
 
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !Paris Salesforce Developer Group
 
Conférence Titanium + Alloy au JUG Montpellier
Conférence Titanium + Alloy au JUG MontpellierConférence Titanium + Alloy au JUG Montpellier
Conférence Titanium + Alloy au JUG MontpellierDamien Laureaux
 
Javascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryJavascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryneuros
 
eServices-Tp1: Web Services
eServices-Tp1: Web ServiceseServices-Tp1: Web Services
eServices-Tp1: Web ServicesLilia Sfaxi
 
Web dev open door
Web dev   open doorWeb dev   open door
Web dev open doorLeTesteur
 
Formation java script
Formation java scriptFormation java script
Formation java scriptRomdhani Asma
 

Similaire à Devoxx France - Nouvelles du Front (20)

Visual Studio 2008 Overview
Visual Studio 2008 OverviewVisual Studio 2008 Overview
Visual Studio 2008 Overview
 
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
 
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
 
Patterns and OOP in PHP
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHP
 
Linq et Entity framework
Linq et Entity frameworkLinq et Entity framework
Linq et Entity framework
 
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
 
Séminaire Ruby on Rails (novembre 2010)
Séminaire Ruby on Rails (novembre 2010)Séminaire Ruby on Rails (novembre 2010)
Séminaire Ruby on Rails (novembre 2010)
 
react-slides.ppx (2) (1).pptx react presentation basic
react-slides.ppx (2) (1).pptx react presentation basicreact-slides.ppx (2) (1).pptx react presentation basic
react-slides.ppx (2) (1).pptx react presentation basic
 
Linq Tech Days08 Lux
Linq Tech Days08 LuxLinq Tech Days08 Lux
Linq Tech Days08 Lux
 
react-fr.pdf
react-fr.pdfreact-fr.pdf
react-fr.pdf
 
ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours
ENIB cours CAI Web - Séance 3 - JSP/Servlet - CoursENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours
ENIB cours CAI Web - Séance 3 - JSP/Servlet - Cours
 
Initiation au JavaScript
Initiation au JavaScriptInitiation au JavaScript
Initiation au JavaScript
 
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
 
Native script
Native scriptNative script
Native script
 
Conférence Titanium + Alloy au JUG Montpellier
Conférence Titanium + Alloy au JUG MontpellierConférence Titanium + Alloy au JUG Montpellier
Conférence Titanium + Alloy au JUG Montpellier
 
Javascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryJavascript ne se limite pas à jquery
Javascript ne se limite pas à jquery
 
eServices-Tp1: Web Services
eServices-Tp1: Web ServiceseServices-Tp1: Web Services
eServices-Tp1: Web Services
 
Web dev open door
Web dev   open doorWeb dev   open door
Web dev open door
 
Formation java script
Formation java scriptFormation java script
Formation java script
 
Vs2008 Linq
Vs2008 LinqVs2008 Linq
Vs2008 Linq
 

Plus de Publicis Sapient Engineering

XebiCon'18 - L'algorithme de reconnaissance de formes par le cerveau humain
XebiCon'18 - L'algorithme de reconnaissance de formes par le cerveau humainXebiCon'18 - L'algorithme de reconnaissance de formes par le cerveau humain
XebiCon'18 - L'algorithme de reconnaissance de formes par le cerveau humainPublicis Sapient Engineering
 
Xebicon'18 - Spark in jail : conteneurisez vos traitements data sans serveur
Xebicon'18 - Spark in jail : conteneurisez vos traitements data sans serveurXebicon'18 - Spark in jail : conteneurisez vos traitements data sans serveur
Xebicon'18 - Spark in jail : conteneurisez vos traitements data sans serveurPublicis Sapient Engineering
 
XebiCon'18 - La Web App d'aujourd'hui et de demain : état de l'art et bleedin...
XebiCon'18 - La Web App d'aujourd'hui et de demain : état de l'art et bleedin...XebiCon'18 - La Web App d'aujourd'hui et de demain : état de l'art et bleedin...
XebiCon'18 - La Web App d'aujourd'hui et de demain : état de l'art et bleedin...Publicis Sapient Engineering
 
XebiCon'18 - Des notebook pour le monitoring avec Zeppelin
XebiCon'18 - Des notebook pour le monitoring avec Zeppelin XebiCon'18 - Des notebook pour le monitoring avec Zeppelin
XebiCon'18 - Des notebook pour le monitoring avec Zeppelin Publicis Sapient Engineering
 
XebiCon'18 - Event Sourcing et RGPD, incompatibles ?
XebiCon'18 - Event Sourcing et RGPD, incompatibles ?XebiCon'18 - Event Sourcing et RGPD, incompatibles ?
XebiCon'18 - Event Sourcing et RGPD, incompatibles ?Publicis Sapient Engineering
 
XebiCon'18 - Deno, le nouveau NodeJS qui inverse la tendance ?
XebiCon'18 - Deno, le nouveau NodeJS qui inverse la tendance ?XebiCon'18 - Deno, le nouveau NodeJS qui inverse la tendance ?
XebiCon'18 - Deno, le nouveau NodeJS qui inverse la tendance ?Publicis Sapient Engineering
 
XebiCon'18 - Boostez vos modèles avec du Deep Learning distribué
XebiCon'18 - Boostez vos modèles avec du Deep Learning distribuéXebiCon'18 - Boostez vos modèles avec du Deep Learning distribué
XebiCon'18 - Boostez vos modèles avec du Deep Learning distribuéPublicis Sapient Engineering
 
XebiCon'18 - Comment j'ai développé un jeu vidéo avec des outils de développe...
XebiCon'18 - Comment j'ai développé un jeu vidéo avec des outils de développe...XebiCon'18 - Comment j'ai développé un jeu vidéo avec des outils de développe...
XebiCon'18 - Comment j'ai développé un jeu vidéo avec des outils de développe...Publicis Sapient Engineering
 
XebiCon'18 - Les utilisateurs finaux, les oubliés de nos produits !
XebiCon'18 - Les utilisateurs finaux, les oubliés de nos produits !XebiCon'18 - Les utilisateurs finaux, les oubliés de nos produits !
XebiCon'18 - Les utilisateurs finaux, les oubliés de nos produits !Publicis Sapient Engineering
 
XebiCon'18 - Comment fausser l'interprétation de vos résultats avec des dataviz
XebiCon'18 - Comment fausser l'interprétation de vos résultats avec des datavizXebiCon'18 - Comment fausser l'interprétation de vos résultats avec des dataviz
XebiCon'18 - Comment fausser l'interprétation de vos résultats avec des datavizPublicis Sapient Engineering
 
XebiCon'18 - Architecturer son application mobile pour la durabilité
XebiCon'18 - Architecturer son application mobile pour la durabilitéXebiCon'18 - Architecturer son application mobile pour la durabilité
XebiCon'18 - Architecturer son application mobile pour la durabilitéPublicis Sapient Engineering
 
XebiCon'18 - Sécuriser son API avec OpenID Connect
XebiCon'18 - Sécuriser son API avec OpenID ConnectXebiCon'18 - Sécuriser son API avec OpenID Connect
XebiCon'18 - Sécuriser son API avec OpenID ConnectPublicis Sapient Engineering
 
XebiCon'18 - Structuration du Temps et Dynamique de Groupes, Théorie organisa...
XebiCon'18 - Structuration du Temps et Dynamique de Groupes, Théorie organisa...XebiCon'18 - Structuration du Temps et Dynamique de Groupes, Théorie organisa...
XebiCon'18 - Structuration du Temps et Dynamique de Groupes, Théorie organisa...Publicis Sapient Engineering
 
XebiCon'18 - La sécurité, douce illusion même en 2018
XebiCon'18 - La sécurité, douce illusion même en 2018XebiCon'18 - La sécurité, douce illusion même en 2018
XebiCon'18 - La sécurité, douce illusion même en 2018Publicis Sapient Engineering
 
XebiCon'18 - Utiliser Hyperledger Fabric pour la création d'une blockchain pr...
XebiCon'18 - Utiliser Hyperledger Fabric pour la création d'une blockchain pr...XebiCon'18 - Utiliser Hyperledger Fabric pour la création d'une blockchain pr...
XebiCon'18 - Utiliser Hyperledger Fabric pour la création d'une blockchain pr...Publicis Sapient Engineering
 
XebiCon'18 - Ce que l'histoire du métro Parisien m'a enseigné sur la création...
XebiCon'18 - Ce que l'histoire du métro Parisien m'a enseigné sur la création...XebiCon'18 - Ce que l'histoire du métro Parisien m'a enseigné sur la création...
XebiCon'18 - Ce que l'histoire du métro Parisien m'a enseigné sur la création...Publicis Sapient Engineering
 

Plus de Publicis Sapient Engineering (20)

XebiCon'18 - L'algorithme de reconnaissance de formes par le cerveau humain
XebiCon'18 - L'algorithme de reconnaissance de formes par le cerveau humainXebiCon'18 - L'algorithme de reconnaissance de formes par le cerveau humain
XebiCon'18 - L'algorithme de reconnaissance de formes par le cerveau humain
 
Xebicon'18 - IoT: From Edge to Cloud
Xebicon'18 - IoT: From Edge to CloudXebicon'18 - IoT: From Edge to Cloud
Xebicon'18 - IoT: From Edge to Cloud
 
Xebicon'18 - Spark in jail : conteneurisez vos traitements data sans serveur
Xebicon'18 - Spark in jail : conteneurisez vos traitements data sans serveurXebicon'18 - Spark in jail : conteneurisez vos traitements data sans serveur
Xebicon'18 - Spark in jail : conteneurisez vos traitements data sans serveur
 
XebiCon'18 - Modern Infrastructure
XebiCon'18 - Modern InfrastructureXebiCon'18 - Modern Infrastructure
XebiCon'18 - Modern Infrastructure
 
XebiCon'18 - La Web App d'aujourd'hui et de demain : état de l'art et bleedin...
XebiCon'18 - La Web App d'aujourd'hui et de demain : état de l'art et bleedin...XebiCon'18 - La Web App d'aujourd'hui et de demain : état de l'art et bleedin...
XebiCon'18 - La Web App d'aujourd'hui et de demain : état de l'art et bleedin...
 
XebiCon'18 - Des notebook pour le monitoring avec Zeppelin
XebiCon'18 - Des notebook pour le monitoring avec Zeppelin XebiCon'18 - Des notebook pour le monitoring avec Zeppelin
XebiCon'18 - Des notebook pour le monitoring avec Zeppelin
 
XebiCon'18 - Event Sourcing et RGPD, incompatibles ?
XebiCon'18 - Event Sourcing et RGPD, incompatibles ?XebiCon'18 - Event Sourcing et RGPD, incompatibles ?
XebiCon'18 - Event Sourcing et RGPD, incompatibles ?
 
XebiCon'18 - Deno, le nouveau NodeJS qui inverse la tendance ?
XebiCon'18 - Deno, le nouveau NodeJS qui inverse la tendance ?XebiCon'18 - Deno, le nouveau NodeJS qui inverse la tendance ?
XebiCon'18 - Deno, le nouveau NodeJS qui inverse la tendance ?
 
XebiCon'18 - Boostez vos modèles avec du Deep Learning distribué
XebiCon'18 - Boostez vos modèles avec du Deep Learning distribuéXebiCon'18 - Boostez vos modèles avec du Deep Learning distribué
XebiCon'18 - Boostez vos modèles avec du Deep Learning distribué
 
XebiCon'18 - Comment j'ai développé un jeu vidéo avec des outils de développe...
XebiCon'18 - Comment j'ai développé un jeu vidéo avec des outils de développe...XebiCon'18 - Comment j'ai développé un jeu vidéo avec des outils de développe...
XebiCon'18 - Comment j'ai développé un jeu vidéo avec des outils de développe...
 
XebiCon'18 - Les utilisateurs finaux, les oubliés de nos produits !
XebiCon'18 - Les utilisateurs finaux, les oubliés de nos produits !XebiCon'18 - Les utilisateurs finaux, les oubliés de nos produits !
XebiCon'18 - Les utilisateurs finaux, les oubliés de nos produits !
 
XebiCon'18 - Comment fausser l'interprétation de vos résultats avec des dataviz
XebiCon'18 - Comment fausser l'interprétation de vos résultats avec des datavizXebiCon'18 - Comment fausser l'interprétation de vos résultats avec des dataviz
XebiCon'18 - Comment fausser l'interprétation de vos résultats avec des dataviz
 
XebiCon'18 - Le développeur dans la Pop Culture
XebiCon'18 - Le développeur dans la Pop Culture XebiCon'18 - Le développeur dans la Pop Culture
XebiCon'18 - Le développeur dans la Pop Culture
 
XebiCon'18 - Architecturer son application mobile pour la durabilité
XebiCon'18 - Architecturer son application mobile pour la durabilitéXebiCon'18 - Architecturer son application mobile pour la durabilité
XebiCon'18 - Architecturer son application mobile pour la durabilité
 
XebiCon'18 - Sécuriser son API avec OpenID Connect
XebiCon'18 - Sécuriser son API avec OpenID ConnectXebiCon'18 - Sécuriser son API avec OpenID Connect
XebiCon'18 - Sécuriser son API avec OpenID Connect
 
XebiCon'18 - Structuration du Temps et Dynamique de Groupes, Théorie organisa...
XebiCon'18 - Structuration du Temps et Dynamique de Groupes, Théorie organisa...XebiCon'18 - Structuration du Temps et Dynamique de Groupes, Théorie organisa...
XebiCon'18 - Structuration du Temps et Dynamique de Groupes, Théorie organisa...
 
XebiCon'18 - Spark NLP, un an après
XebiCon'18 - Spark NLP, un an aprèsXebiCon'18 - Spark NLP, un an après
XebiCon'18 - Spark NLP, un an après
 
XebiCon'18 - La sécurité, douce illusion même en 2018
XebiCon'18 - La sécurité, douce illusion même en 2018XebiCon'18 - La sécurité, douce illusion même en 2018
XebiCon'18 - La sécurité, douce illusion même en 2018
 
XebiCon'18 - Utiliser Hyperledger Fabric pour la création d'une blockchain pr...
XebiCon'18 - Utiliser Hyperledger Fabric pour la création d'une blockchain pr...XebiCon'18 - Utiliser Hyperledger Fabric pour la création d'une blockchain pr...
XebiCon'18 - Utiliser Hyperledger Fabric pour la création d'une blockchain pr...
 
XebiCon'18 - Ce que l'histoire du métro Parisien m'a enseigné sur la création...
XebiCon'18 - Ce que l'histoire du métro Parisien m'a enseigné sur la création...XebiCon'18 - Ce que l'histoire du métro Parisien m'a enseigné sur la création...
XebiCon'18 - Ce que l'histoire du métro Parisien m'a enseigné sur la création...
 

Devoxx France - Nouvelles du Front

  • 1. Swift : Nouvelles du front
  • 2. Swift : Nouvelles du front #Xebia #DevoxxFR Fabien Mirault Speakers @viteinfinite Simone Civetta @magici1
  • 4. Swift : Nouvelles du front #Xebia #DevoxxFR Swift ou pas ? Septembre 2014 Novembre 2014Juin 2014 Apple annonce Swift ! Swift 1.0 ! Première application Swift Xebia sur l’App Store ? Février 2015 Nouvelles applications ?
  • 6. 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 !
  • 7. 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
  • 9. Swift : Nouvelles du front #Xebia #DevoxxFR Swift ou pas ? Juin 2014 Apple annonce Swift ! Septembre 2014 Swift 1.0 Novembre 2014 ! Première application Swift Xebia sur l’App Store ? Février 2015 Nouvelles applications !
  • 10. Swift : Nouvelles du front #Xebia #DevoxxFR Swift ou pas ? Octobre 2014 Swift 1.1 September 2015 Swift 2.0 Octobre 2014 Swift 2.1 April 2015 Swift 1.2 Juin 2014 Apple annonce Swift ! Septembre 2014 Swift 1.0 Novembre 2014 ! Première application Swift Xebia sur l’App Store ? Février 2015 Nouvelles applications ! Mars 2016 Swift 2.2
  • 12. Swift : Nouvelles du front #Xebia #DevoxxFR TOC Nos cas d’usage Flux d’activité Création du projet et configuration Produits et synchronisation Langues Commentaires Testing Suivre son application Et l’Objective-C ?
  • 14. Swift : Nouvelles du front #Xebia #DevoxxFR Les dépendances Librairies dynamiques
  • 15. Swift : Nouvelles du front #Xebia #DevoxxFRSlide Title Title Au revoir iOS 7
  • 16. Swift : Nouvelles du front #Xebia #DevoxxFR Les dépendances
  • 18. Swift : Nouvelles du front #Xebia #DevoxxFR Photos et vidéos Fluidité Des milliers de posts Flux d’activités
  • 19. 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
  • 20. 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és Exemple de Struct
  • 21. Swift : Nouvelles du front #Xebia #DevoxxFRFlux d’activités Struct : Performances Avec une méthode de shuffle sur 1.000.000 d’objets Secondes 0 0,325 0,65 0,975 1,3 NSObject Struct 0,064 1,152
  • 22. 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
  • 23. 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   }
  • 24. Swift : Nouvelles du front #Xebia #DevoxxFRFlux d’activités Unbox Conversion automatique Génère des structs Performances accrues
  • 25. 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   }
  • 26. Swift : Nouvelles du front #Xebia #DevoxxFRFlux d’activités Performances Struct Héritage Rendu
  • 28. Swift : Nouvelles du front #Xebia #DevoxxFR Analytics Endpoints Regroupement Configurations Profil
  • 29. 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
  • 31. Swift : Nouvelles du front #Xebia #DevoxxFR 600.000+ lignes! Requêtes rapides! Liste de produits
  • 32. 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];   }
  • 33. 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];   }
  • 34. 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
  • 35. Swift : Nouvelles du front #Xebia #DevoxxFRListe de produits Generics Écrire du code facilement réutilisable et sujet à des contraintes spécifiques
  • 36. Swift : Nouvelles du front #Xebia #DevoxxFRListe de produits TypeAlias typealias  ProductStore  =  EntityStore<Product>   func  addSomeObjects()  {          let  productStore  =  ProductStore()                  //  ...   }   Code plus expressif
  • 37. 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?   }
  • 38. 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
  • 39. 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          }   }
  • 40. 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          }   }
  • 41. 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  {  /*  ...  */  }
  • 43. Swift : Nouvelles du front #Xebia #DevoxxFR Synchronisation et manipulation 500 Mo de données ! Performances! Synchronisation
  • 44. Swift : Nouvelles du front #Xebia #DevoxxFRSynchronisation Performances déclarations final et static Profiter pleinement du runtime de Swift
  • 45. Swift : Nouvelles du front #Xebia #DevoxxFRSynchronisation Performances Attention aux casts entre Array ↔ NSArray Dictionary ↔ NSDictionary
  • 47. Swift : Nouvelles du front #Xebia #DevoxxFR Librairie locale Tâches asynchrones Ecran personnalisé Animation diaphragme Appareil photo
  • 48. 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  }
  • 49. Swift : Nouvelles du front #Xebia #DevoxxFRTâches asynchrones Exemple de closure self.closeDiaphragm  {  _  in          self.openDiaphragm()   }
  • 50. 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?
  • 51. 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)   }
  • 52. Swift : Nouvelles du front #Xebia #DevoxxFRTâches asynchrones Optionals : fiabilité ! Source : DevFee (Developers feeling)
  • 53. Swift : Nouvelles du front #Xebia #DevoxxFR Appels asynchrones Tâches asynchrones Sur n’importe quel post Gestion des retours serveur Poster un commentaire
  • 54. Swift : Nouvelles du front #Xebia #DevoxxFRTâches asynchrones Promise Code plus lisible Idéal pour les tâches asynchrones Chaînage possible
  • 55. 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()                      }
  • 56. 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()                          }              }   }                          
  • 57. Swift : Nouvelles du front #Xebia #DevoxxFR SwiftTasks Une des librairies principales Mise en place simple… …mais des erreurs dans Xcode
  • 58. 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   }  
  • 60. Swift : Nouvelles du front #Xebia #DevoxxFR Simple requête HTTP! Mise à jour de la UI! Disponibilité produit
  • 61. Swift : Nouvelles du front #Xebia #DevoxxFRDisponibilité produit Les étapes Récupération Déserialisation UI
  • 62. Swift : Nouvelles du front #Xebia #DevoxxFRDisponibilité produit Functional Reactive Programming Propagation de messages Asynchronisme Robustesse
  • 63. 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")
  • 64. Swift : Nouvelles du front #Xebia #DevoxxFR ReactiveCocoa github.com/ReactiveCocoa/ Disponibilité produit
  • 65. Swift : Nouvelles du front #Xebia #DevoxxFR ReactKit github.com/ReactKit/ Disponibilité produit
  • 66. 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
  • 67. 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
  • 68. 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")<~
  • 69. Swift : Nouvelles du front #Xebia #DevoxxFRSlide Title Title
  • 71. Swift : Nouvelles du front #Xebia #DevoxxFR Changement de la langue! Traduction des contenus! Traduction de l’IHM! Internationalisation
  • 72. Swift : Nouvelles du front #Xebia #DevoxxFRInternationalisation Enums enum  Country  {          case  USA          case  China          case  Italy   }   Et finalement du Swift
  • 73. Swift : Nouvelles du front #Xebia #DevoxxFRInternationalisation Enums enum  Country  {          case  USA          case  China          case  Italy          static  var  preferred:  Country  {                  return  Country.Italy          }   }   Country.preferred  //  .Italy   Et finalement du Swift Valeurs associées
  • 74. Swift : Nouvelles du front #Xebia #DevoxxFRInternationalisation Enums enum  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
  • 75. Swift : Nouvelles du front #Xebia #DevoxxFRInternationalisation Switch enum  Language  {          case  English          case  Italian          //  ...          var  language:  String  {                  switch  self  {                  //  ...                  }          }   }   Swift
  • 76. Swift : Nouvelles du front #Xebia #DevoxxFRInternationalisation Switch enum  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
  • 77. 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
  • 78. Tests
  • 79. Swift : Nouvelles du front #Xebia #DevoxxFR Assurer le fonctionnement de l’application Se protéger des régressions Tests
  • 80. Swift : Nouvelles du front #Xebia #DevoxxFRTests Chargement des produits Product.load("A00") Comment tester ?
  • 81. 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          }   }
  • 82. 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          }   }
  • 83. 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")
  • 84. Swift : Nouvelles du front #Xebia #DevoxxFRListe de produits Swift VS Swift class  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
  • 85. Swift : Nouvelles du front #Xebia #DevoxxFRSlide Title Title #DevoxxFR Swift : Nouvelles du front
  • 86. Swift : Nouvelles du front #Xebia #DevoxxFRSlide Title Title #DevoxxFR Swift : Nouvelles du front
  • 87. Swift : Nouvelles du front #Xebia #DevoxxFRTests Mais aussi…
  • 88. Swift : Nouvelles du front #Xebia #DevoxxFRFlux d’activités Flux d’activités Crash
  • 89. Swift : Nouvelles du front #Xebia #DevoxxFRTests Mais aussi…
  • 90. Swift : Nouvelles du front #Xebia #DevoxxFRTests Mais aussi…
  • 92. Swift : Nouvelles du front #Xebia #DevoxxFRSuivre son application Fabric Déploiement centralisé et versionné Remontées de crashs Statistiques d’utilisation
  • 93. 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
  • 94. 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
  • 95. Swift : Nouvelles du front #Xebia #DevoxxFRSuivre son application Pourquoi ? Évolution du langage constante Rétrocompatibilité non assurée
  • 97. Swift : Nouvelles du front #Xebia #DevoxxFR Et l’Objective-C dans tout ça ? Toujours valable Mais développement plus lent Migration progressive conseillée
  • 98. Swift : Nouvelles du front #Xebia #DevoxxFR Popularitédesrecherches 2014 2015 2016 Objective-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 ?
  • 99. 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 !
  • 100. Swift : Nouvelles du front #Xebia #DevoxxFR
  • 102.
  • 103. 23-24 septembre frenchkit.fr Billets en vente dès aujourd’hui CocoaHeads Paris
  • 105. Swift : Nouvelles du front #Xebia #DevoxxFR Un peu de lecture A Swift Kickstart
 Daniel Steinberg Functional Programming in Swift
 Chris Eidhof, Florian Kugler, and Wouter Swierstra http://blog.xebia.fr/tag/swift L’équipe iOS Xebia Advanced Swift
 Chris Eidhof and Airspeed Velocity