Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

De java à swift en 2 temps trois mouvements

623 visualizaciones

Publicado el

Swift est désormais open source ! "Google considérerait Swift comme un langage « de première classe » pour Android" pouvait-on lire en avril sur le réseau. Et enfin un portage Android du langage a été "merge" dans la base de code officielle de Swift.

Bon tout ceci est un bon prétexte pour apprendre ce nouveau langage et les possibilités qu'il peut nous apporter en terme de développement. Une comparaison avec Java sera notamment proposée afin de montrer les similitudes et differences entre ces deux langages .

Publicado en: Software
  • Sé el primero en comentar

De java à swift en 2 temps trois mouvements

  1. 1. DE JAVA À SWIFT   EN 2 TEMPS   TROIS MOUVEMENTS 3 novembre 2016 ( )Didier Plaindoux @dplaindoux
  2. 2. Computer scientist Freelance λ
  3. 3. Développement lancé en 2010 par Chris Lattner HISTORIQUE DE SWIFT v1.0: Dévoilé durant la WWDC en 2014 v2.0: Ouverture du compilateur en 2015 v3.0: Publication en septembre 2016
  4. 4. DÉVELOPPER AVEC SWIFT XCode CLion Vi, Emacs
  5. 5. EXÉCUTER SWIFT iOS, OSX Version 14.04+ (Docker) IBM Cloud (LinuxOne)
  6. 6. LANGAGE INSPIRÉ PAR ... Objective-C C# Orienté Objet Haskell OCaml Fonctionnel Ruby Python Expressivité
  7. 7. MÉTAMORPHOSE D'UNE CLASSE JAVA public class Personne { private final String nom; private int age; public Personne(String nom, int age) { this.nom = nom; this.age = age; } public void anniversaire() { this.age += 1; } }
  8. 8. SÉPARATEURS public class Personne { private final String nom private int age public Personne(String nom, int age) { this.nom = nom this.age = age } public void anniversaire() { this.age += 1 } }
  9. 9. ATTRIBUTS public class Personne { private let nom:String // Constant private var age:Int // Variable public Personne(String nom, int age) { this.nom = nom this.age = age } public void anniversaire() { this.age += 1 } }
  10. 10. PARAMÈTRES public class Personne { private let nom:String private var age:Int public Personne(nom:String, age:Int) { this.nom = nom this.age = age } public void anniversaire() { this.age += 1 } }
  11. 11. INITIALISATION public class Personne { private let nom:String private var age:Int public init(nom:String, age:Int) { this.nom = nom this.age = age } public void anniversaire() { this.age += 1 } }
  12. 12. FONCTION public class Personne { private let nom:String private var age:Int public init(nom:String, age:Int) { this.nom = nom this.age = age } public func anniversaire() -> Void { this.age += 1 } }
  13. 13. FONCTION OU PROCÉDURE public class Personne { private let nom:String private var age:Int public init(nom:String, age:Int) { this.nom = nom this.age = age } public func anniversaire() { this.age += 1 } }
  14. 14. UNE CLASSE SWIFT public class Personne { private let nom:String private var age:Int public init(nom:String, age:Int) { self.nom = nom self.age = age } public func anniversaire() { self.age += 1 } }
  15. 15. SURVOL DU LANGAGE
  16. 16. DONNÉES, TYPES INITIAUX ETC. Le Fonctionnel Les Objets
  17. 17. VARIABLES OU CONSTANTES JAVA SWIFT int age final String nom var age:Int let nom:String
  18. 18. LES COLLECTIONS JAVA SWIFT Arrays.asList("Hello", "World") Map<String, Integer> m = new HashMap<>(); m.put("A", 10); m.put("B", 20); ["Hello", "World"] ["A":10, "B":20] Fonctions disponibles map, atMap, lter etc.
  19. 19. DONNÉE OPTIONNELLE JAVA SWIFT Optional<String> n = Optional.of("A"); Optional<Integer> t = n.map(v -> v.length()); if (t.isPresent()) { // t.get(); } let n:String? = "A" // ou nil let t:Int? = n?.characters.count if let taille = t { // taille utilisable } Fonctions disponibles map, atMap, lter etc. Donnée optionnelle "portée" par le typage uniquement. Non structurel !
  20. 20. TUPLES JAVA ∅ SWIFT Index ↔Nom (42, "John Doe") // (Int, String) (42, "John Doe").1 == "John Doe" (42, nom:"John Doe") // (Int, String) (42, nom:"John Doe").1 == "John Doe" (42, nom:"John Doe").nom == "John Doe"
  21. 21. STRUCTURES DE CONTRÔLE Sélection conditionnelle Garde pour les optionnels Répétition if expression { // bloc en cas de succés } else { // bloc optionnel en cas d'échec } guard let valeur = expression else { // valeur n'est pas définie } // valeur est définie let segment = 0..<100 for index in segment { // bloc répété }
  22. 22. Données, Types initiaux etc. LE FONCTIONNEL Les Objets
  23. 23. TYPE FONCTIONNEL JAVA SWIFT Type aliasing Function<A,B> Supplier<B> Consumer<A> Predicate<A> ... (A) -> B () -> B (A) -> () (A) -> Bool ... typealias Supplier<B> = () -> B
  24. 24. FONCTION func Nom(Parametres) -> Type Resultat { Corps De La Fonction }
  25. 25. FONCTION :: PARAMÈTRES func multiplier(a:Int, b:Int) -> Int { return a * b } En interne les noms des paramètres capturent les valeurs lors de l'appel multiplier(a:2, b:3) En externe les noms des paramètres servent de "marques" pour les arguments Permutation des arguments interdite
  26. 26. FONCTION :: NOM EXTERNE SPÉCIFIQUE Spéci cation d'un nom externe di érent func multiplier(a:Int, par b:Int) -> Int { return multiplier(a:a, b:b) } multiplier(a:2, par:3)
  27. 27. FONCTION :: AUCUN NOM EXTERNE Spéci cation a n de ne pas avoir de nom externe func multiplier( _ a:Int, par b:Int) -> Int { return multiplier(a:a, b:b) } multiplier(2, par:3)
  28. 28. FONCTION ANONYME :: CLOSURE JAVA SWIFT [Parametres] -> [Corps De La Fonction] { [Parametres] -> [Type Retour] in [Corps De La Fonction] } { [Parametres] in [Corps De La Fonction] } Objet de Première Classe
  29. 29. CLOSURE :: EXEMPLES let multiplier = { (a:Int, b:Int) -> Int in a * b } Pas de séléction par nommage des paramètres car inutile ! multiplier(2,3)
  30. 30. CLOSURE :: SYNTHÈSE DE TYPE let multiplier = { (a:Int,b:Int) in a * b } let multiplier = { (a,b:Int) in a * b } let multiplier = { a,b -> Int in a * b } // (Int, Int) -> Int
  31. 31. CLOSURE :: SYNTHÈSE DE TYPE let multiplier = { a,b in a * b } error ambiguous use of operator '*' Int ? Float ? Double ? ...
  32. 32. CLOSURE :: SYNTHÈSE DE TYPE ! let multiplier : (Int,Int) -> Int = { a,b in a * b } Spéci cation vs. Mise en oeuvre
  33. 33. FONCTION :: ORDRE SUPÉRIEUR Fonction qui manipule une fonction func appliquer(_ f:(Int) -> Int, _ a:Int) -> Int { return f(a) } // appliquer(f,a) ⟶* f(a) Forme restreinte au type Int → Int !
  34. 34. FONCTION :: GÉNÉRICITÉ Paramétrisation à la C++, Java, C# func appliquer<A,B>(_ f:(A) -> B, _ a:A) -> B { return f(a) } Possibilité de spéci er des contraintes func estEgal<A:Equatable>(_ a:A, _ b:A) -> Bool { return a == b }
  35. 35. INCONSISTANCE & PIÈCES MANQUANTES η-conversion pas généralisable en présence de surcharges équivalentes Récursivité terminale Non garantie par le compilateur Compréhension Concept inexistant { x in f(x) } ≡? f
  36. 36. Données, Types initiaux etcs. Le Fonctionnel LES OBJETS
  37. 37. LES OBJETS Ecole Scandinave Simula, C++, Objective-C, Ei el, Java, C# ... Swift Abstraction de donnée ↔Classe ↔Type Repose sur un Typage Statique
  38. 38. PARADIGME OBJET JAVA SWIFT Interface Protocole Classe Classe ∅ Structure Enumération Enumération
  39. 39. PROTOCOLE Base de connaissances Extension de Protocoles
  40. 40. PROTOCOLE :: BASE DE CONNAISSANCES public protocol Monde { func vivants() -> [Personne] func recherche(nom:String) -> Personne? }
  41. 41. PROTOCOLE :: MISE EN OEUVRE extension Monde { func recherche(nom:String) -> Personne? { return vivants().filter{ p in p.nom == nom }.first } } Assimilable au "default" des interfaces dans Java 8 Idem pour les classes, structures et enumérations
  42. 42. PROTOCOLE :: GÉNÉRICITÉ protocol Copiable { associatedtype E func copier<C:Copiable where C.E == E>() -> C // 0_o } Spéci cation de Type Membre ≢ Paramétrisation Spécialisation par le typealias
  43. 43. CLASSE Etat interne Base de connaissances Héritage simple Mise en oeuvre de Protocoles
  44. 44. CLASSE :: ETAT INTERNE & INITIALISATION public class Personne { private let nom:String private var age:Int public init(nom:String, age:Int) { self.nom = nom self.age = age } } Pas de mot clé new Personne(nom:"John Doe", age:42)
  45. 45. CLASSE :: INITIALISATION & OPTIONNEL Initialisation pouvant retourner nil public class Personne { private let nom:String private var age:Int public init?(nom:String, age:Int) { guard age > -1 else { return nil } // if age < 0 { return nil } self.nom = nom self.age = age } } let personne:Personne? = Personne(nom:"John Doe", age:-1)
  46. 46. CLASSE :: BASE DE CONNAISSANCES Méthode d'instance (surchargeable) Méthode statique (non surchargeable) Méthode de classe (surchargeables) class Personne { ⊞ ... func aPourNom() -> String { return self.nom } } class Personne { ⊞ ... static func new(nom:String) -> Personne {...} } class Personne { ⊞ ... class func new(nom:String) -> Personne {...} }
  47. 47. CLASSE :: REFERENCE TYPE public class Personne { private let nom:String private var age:Int ⊞ public init(nom:String, age:Int) { ... } } let personne1 = Personne(nom:"John Doe", age:42) let personne2 = personne1 personne1 et personne2 référencent la même donnée en mémoire
  48. 48. STRUCTURE Etat interne Base de connaissances Mise en oeuvre de Protocoles
  49. 49. STRUCTURE :: INITIALISATION public struct Personne { let nom:String var age:Int } Méthode init implicite. Redé nition possible. Personne(nom:"John Doe", age:42)
  50. 50. STRUCTURE :: REFERENCE VALUE var personne1 = Personne(nom:"John Doe", age:42) let personne2 = personne1 personne1.age += 1 // personne1.age == 43 // personne2.age == 42 personne1 et personne2 ne référencent pas la même donnée en mémoire
  51. 51. ENUMÉRATION Spéci cation de formes Etat interne Base de connaissances Mise en oeuvre de Protocoles
  52. 52. ENUMÉRATION :: SPÉCIFICATION DE FORMES public enum StadePersonne { case Enfant, Adolescent, Adulte } let s : StadePersonne = ... switch s { case StadePersonne.Enfant: // ... case StadePersonne.Adolescent: // ... case StadePersonne.Adulte: // ... } Le switch/case doit être exhaustif / Véri é à la compilation
  53. 53. ENUMÉRATION :: SWITCH AVANCÉ public enum PeutEtre<T> { case QuelqueChose(value:T), Rien public func get(_ valeurParDefaut:T) -> T { switch self { case .QuelqueChose(let v): return v case _: return valeurParDefaut } } } Pattern Matching
  54. 54. self ou ... Self
  55. 55. self : Self public class Personne { private let nom:String private var age:Int ⊞ public init(nom:String) { ... } public func anniversaire() -> Self { self.age += 1 return self } } Le type Self dénote le type de l'objet courant à savoir ... self
  56. 56. DÉNOTATION DU TYPE COURANT JAVA SWIFT interface Copiable<Self extends Copiable<Self>> { Self copie(); } protocol Copiable { func copie() -> Self } "F-Bounded quanti cation polymorphism"
  57. 57. SELF :: COPIABLE class Personne : Copiable { private let nom:String private var age:Int func copie() -> Self { return type(of:self).init(nom:self.nom, age:self.age) } required init(nom:String, age:Int) { self.nom = nom self.age = 0 } } required force la dé nition dans les sous-classes
  58. 58. SELF :: INITIALISATION class Personne { private let nom:String private var age:Int required init(nom:String, age:Int) { self.nom = nom self.age = 0 } class func new(nom:String) -> Self { return self.init(nom:nom, age:0) // self ≡ Personne } } Cela me rappelle furieusement le new de Perl !
  59. 59. UN TOUR D'HORIZON (TROP) RAPIDE ! Gestion des erreurs Structure & Mutation Notion de module Swift & Android via le NDK (Swift ⇒C) etc ...
  60. 60. PROSÉLYTISME ! Meetup ! Site o ciel A curated list of awesome iOS ecosystem
  61. 61. MERCI

×