De java à swift en 2 temps trois mouvements

Click here to load reader

  • date post

    23-Jan-2018
  • Category

    Software

  • view

    366
  • download

    0

Embed Size (px)

Transcript of De java à swift en 2 temps trois mouvements

  • DEJAVASWIFTEN2TEMPS

    TROISMOUVEMENTS

    3 novembre 2016 ( )Didier Plaindoux @dplaindoux

    http://d.plaindoux.free.fr/http://twitter.com/dplaindoux

  • Computer scientist Freelance

  • Dveloppement lanc en 2010 par Chris Lattner

    HISTORIQUEDESWIFT

    v1.0: Dvoil durant la WWDC en 2014v2.0: Ouverture du compilateur en 2015v3.0: Publication en septembre 2016

  • DVELOPPERAVECSWIFT

    XCode

    CLion

    Vi, Emacs

  • EXCUTERSWIFT

    iOS, OSX

    Version 14.04+

    (Docker)

    IBM Cloud (LinuxOne)

  • LANGAGEINSPIRPAR...

    Objective-C C#

    Orient Objet

    Haskell OCaml

    Fonctionnel

    Ruby Python

    Expressivit

  • MTAMORPHOSED'UNECLASSEJAVA

    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; } }

  • SPARATEURS

    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 } }

  • 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 } }

  • PARAMTRES

    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 } }

  • 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 } }

  • 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 } }

  • FONCTIONOUPROCDURE

    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 } }

  • UNECLASSESWIFT

    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 } }

  • SURVOLDULANGAGE

  • DONNES,TYPESINITIAUXETC.

    Le Fonctionnel

    Les Objets

  • VARIABLESOUCONSTANTES

    JAVA SWIFT

    int age

    final String nom

    var age:Int

    let nom:String

  • LESCOLLECTIONS

    JAVA SWIFT

    Arrays.asList("Hello", "World")

    Map m = new HashMap(); m.put("A", 10); m.put("B", 20);

    ["Hello", "World"]

    ["A":10, "B":20]

    Fonctions disponibles map, atMap, lter etc.

  • DONNEOPTIONNELLE

    JAVA SWIFT

    Optional n = Optional.of("A"); Optional 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.

    Donne optionnelle "porte" par le typage uniquement. Non structurel !

  • 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"

  • STRUCTURESDECONTRLE

    Slection conditionnelle

    Garde pour les optionnels

    Rptition

    if expression { // bloc en cas de succs } else { // bloc optionnel en cas d'chec }

    guard let valeur = expression else { // valeur n'est pas dfinie }

    // valeur est dfinie

    let segment = 0..

  • Donnes, Types initiaux etc.

    LEFONCTIONNEL

    Les Objets

  • TYPEFONCTIONNEL

    JAVA SWIFT

    Type aliasing

    Function Supplier Consumer Predicate ...

    (A) -> B () -> B (A) -> () (A) -> Bool ...

    typealias Supplier = () -> B

  • FONCTION

    func Nom(Parametres) -> Type Resultat { Corps De La Fonction }

  • FONCTION::PARAMTRES

    func multiplier(a:Int, b:Int) -> Int { return a * b }

    En interne les noms des paramtres capturent les valeurs lors de l'appel

    multiplier(a:2, b:3)

    En externe les noms des paramtres servent de "marques" pour les arguments

    Permutation des arguments interdite

  • FONCTION::NOMEXTERNESPCIFIQUE

    Spcication d'un nom externe dirent

    func multiplier(a:Int, par b:Int) -> Int { return multiplier(a:a, b:b) }

    multiplier(a:2, par:3)

  • FONCTION::AUCUNNOMEXTERNE

    Spcication an 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)

  • FONCTIONANONYME::CLOSURE

    JAVA

    SWIFT

    [Parametres] -> [Corps De La Fonction]

    { [Parametres] -> [Type Retour] in [Corps De La Fonction] } { [Parametres] in [Corps De La Fonction] }

    Objet de Premire Classe

  • CLOSURE::EXEMPLES

    let multiplier = { (a:Int, b:Int) -> Int in a * b }

    Pas de slction par nommage des paramtres car inutile !

    multiplier(2,3)

  • CLOSURE::SYNTHSEDETYPE

    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

  • CLOSURE::SYNTHSEDETYPE

    let multiplier = { a,b in a * b }

    error ambiguous use of operator '*'

    Int ? Float ? Double ? ...

  • CLOSURE::SYNTHSEDETYPE!

    let multiplier : (Int,Int) -> Int = { a,b in a * b }

    Spcication vs. Mise en oeuvre

  • FONCTION::ORDRESUPRIEUR

    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 !

  • FONCTION::GNRICIT

    Paramtrisation la C++, Java, C#

    func appliquer(_ f:(A) -> B, _ a:A) -> B { return f(a) }

    Possibilit de spcier des contraintes

    func estEgal(_ a:A, _ b:A) -> Bool { return a == b }

  • INCONSISTANCE&PICESMANQUANTES

    -conversion pas gnralisable en prsence de surcharges quivalentes

    Rcursivit terminale Non garantie par le compilateur

    Comprhension Concept inexistant

    { x in f(x) } ? f

  • Donnes, Types initiaux etcs.

    Le Fonctionnel

    LESOBJETS

  • LESOBJETS

    Ecole Scandinave

    Simula, C++, Objective-C, Eiel, Java, C# ... Swift

    Abstraction de donne Classe Type

    Repose sur un Typage Statique

  • PARADIGMEOBJET

    JAVA SWIFT

    Interface Protocole

    Classe Classe

    Structure

    Enumration Enumration

  • PROTOCOLE

    Base de connaissancesExtension de Protocoles

  • PROTOCOLE::BASEDECONNAISSANCES

    public protocol Monde { func vivants() -> [Personne] func recherche(nom:String) -> Personne? }

  • PROTOCOLE::MISEENOEUVRE

    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 enumrations

  • PROTOCOLE::GNRICIT

    protocol Copiable { associatedtype E func copier() -> C // 0_o }

    Spcication de Type Membre Paramtrisation

    Spcialisation par le typealias

  • CLASSE

    Etat interneBase de connaissancesHritage simpleMise en oeuvre de Protocoles

  • CLASSE::ETATINTERNE&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)

  • 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)

  • CLASSE::BASEDECONNAISSANCES

    Mthode d'instance(surchargeable)

    Mthode statique(non surchargeable)

    Mthode 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 {...} }

  • CLASSE::REFERENCETYPEpublic 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 rfrencent la mme donne en mmoire

  • STRUCTURE

    Etat interneBase de connaissancesMise en oeuvre de Protocoles

  • STRUCTURE::INITIALISATION

    public struct Personne { let nom:String var age:Int }

    Mthode init implicite. Rednition possible.

    Personne(nom:"John Doe", age:42)

  • STRUCTURE::REFERENCEVALUEvar personne1 = Personne(nom:"John Doe", age:42)let personne2 = personne1

    personne1.age += 1

    // personne1.age == 43 // personne2.age == 42

    personne1 et personne2 ne rfrencent pas la mme donne en mmoire

  • ENUMRATION

    Spcication de formesEtat interneBase de connaissancesMise en oeuvre de Protocoles

  • ENUMRATION::SPCIFICATIONDEFORMES

    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 / Vri la compilation

  • ENUMRATION::SWITCHAVANC

    public enum PeutEtre { case QuelqueChose(value:T), Rien

    public func get(_ valeurParDefaut:T) -> T { switch self { case .QuelqueChose(let v): return v case _: return valeurParDefaut } } }

    Pattern Matching

  • self ou ... Self

  • 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 dnote le type de l'objet courant savoir ... self

  • DNOTATIONDUTYPECOURANT

    JAVA SWIFT

    interface Copiable { Self copie(); }

    protocol Copiable { func copie() -> Self }

    "F-Bounded quantication polymorphism"

  • 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 dnition dans les sous-classes

  • 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 !

  • UNTOURD'HORIZON(TROP)RAPIDE!

    Gestion des erreursStructure & MutationNotion de moduleSwift & Android via le NDK (Swift C)etc ...

  • PROSLYTISME!

    Meetup !

    Site ocielA curated list of awesome iOS ecosystem

    https://swift.org/https://github.com/vsouza/awesome-ios

  • MERCI