SlideShare une entreprise Scribd logo
1  sur  34
Développement iOS
avec Swift
Jean-Philippe Pellet
HEP-VD, Cours 1, 28 janvier 2015
1
Swift sur iOS — Cours 1
Présentations
• Jean-Philippe Pellet, M.Sc. en informatique à l’EPFL,

Ph.D. à l’ETH Zurich/IBM Research
• Développement C, C++, Java, JavaScript, Objective-C,
Scala
• Depuis 2010:Wizbee, plateforme pédagogique, en Scala
• Depuis 2011: Cours de Java au 1er semestre EPFL
• Depuis 2013: HEPVaud, développements pédagogiques
2
Swift sur iOS — Cours 1
Organisation
• Horaire sur Google Drive
• Dossier partagé avec slides, exemple de code, etc.
➡ http://bit.ly/swift-hep
• Alternance entre sessions «cours» et

sessions «projet»
— Cours: 1 période de présentation, 1 période d’exercices
➡ Les exercices sont indépendants de tout projet
— Projet: 2-4 périodes de travail individuel «coaché»
➡ Optionnel, mais recommandé
➡ Selon vos projets personnels d’app ou des projets à définir ensemble
➡ Commande groupée de pizzas pour ceux qui font la soirée
3
Swift sur iOS — Cours 1
Prérequis
• OS X Mavericks (10.9.4+) ou Yosemite (10.10.1+)
• Xcode 6.1.1
• Pour les tests en vrai: un iPad ou iPhone avec iOS 8
— Sinon, les tests se font dans le simulateur
— Le simulateur ne simule pas tout (accéléromètre, location,
compas, etc.)
— Possibilité limitée d’emprunter des iPads de l’UER

(pendant les horaires du cours uniquement)
• Des connaissances de base en programmation
— Pas d’introduction aux principes des variables, des méthodes/
fonctions ou des classes/objets
4
Swift sur iOS — Cours 1
Thèmes proposés
• Bases d’Xcode, bases de Swift
• Swift plus en détails, programmation fonctionnelle
• Storyboards,Autolayout,View controllers
• Coaching technique; pizzas à 19h
• UITableView, données, gestes
• Widgets personnalisés, librairies utiles
• Coaching technique; pizzas à 19h
• Senseurs, CoreLocation
• Transitions, animations
• Coaching technique; pizzas à 19h
• CloudKit, CoreData
• Coaching technique; pizzas à 19h
5
Swift sur iOS — Cours 1
Mode
• Introduction d’un concept avec un morceau de code
commenté
• Discussion du concept sans forcément aller dans tous les
détails
• Le cours n’a pas la forme d’une référence
— Plus de découvertes illustrées par du code
6
Swift sur iOS — Cours 1
Références — livres (I)
• Swift (indépendamment d’iOS)
— The Swift Programming Language (ebook, env. 600 p.)
➡ La très bonne référence gratuite et complète d’Apple
— Swift in 24 Hours, Sams TeachYourself (420 p.)
➡ Excellente description quasi exhaustive de Swift
➡ Exercices, exemples courts et moyens
— Swift Fundamentals:The Language of iOS
Development (260 p.)
➡ Exercices rapides, description pragmatique du langage
➡ Qualité moyenne de mise en page
7
Swift sur iOS — Cours 1
Références — livres (II)
• iOS en Swift (avec exemples spécifiques)
— Beginning iPhone Development with Swift (800 p.)
➡ Toute une série d’introductions et exemples pratiques
sur des API de base (interface graphique, persistence
des données, dessin à l’écran
— iOS 8 Swift Programming Cookbook (870 p.)
➡ Série de chapitre de type use case – discussion – code.
Pratique pour copier-coller initial pour facilement
tester une série d’APIs
— iOS 8 for Programmers:An App-Driven Approach
with Swift (350 p.)
➡ 7 apps complètes expliquées en détails
8
Swift sur iOS — Cours 1
Références — Blogs
• https://developer.apple.com/swift/blog/ 
— Le blog d’Apple, pas extrêmement actif mais informatif et
facile à lire
• http://airspeedvelocity.net, http://nomothetis.svbtle.com
— S’intéressent de près au langage en profondeur
• http://robnapier.net 
— Pas toujours beaucoup de code, discussions plus générales sur
la programmation fonctionnelle et ses paradigmes
9
Swift sur iOS — Cours 1
Références — Autres sites
• http://swiftdoc.org 
➡ Documentation HTML générée automatiquement pour ce que Swift prédéfinit
• Swift Cheat Sheet
➡ Les bases résumées
• http://www.raywenderlich.com
➡ Une incroyable collection de tutoriels en ObjC ou Swift pour iOS
• Design patterns in Swift 
➡ Approche objet-fonctionnelle des design patterns classiques
• https://github.com/pNre/ExSwift
➡ Des extensions aux types et collections de base
• https://thatthinginswift.com
➡ Je sais le faire en ObjC, mais pas en Swift…
10
Swift sur iOS — Cours 1
Références — Twitter
• @clattner_llvm — irrégulier, créateur de Swift
• @SwiftLang — 3–4x par mois
• @NSHipster — 2–3x par mois
• @mattt — 1–2x par mois
• @codinginswift — 1–2x par jour
• @AirspeedSwift — tous les 1–2 jours
• @cocoaphony — tous les 1–2 jours, pas que Swift
• @SwiftDevs — irrégulier
• @XcodeTips — irrégulier, Xcode
11
12
Cours d’aujourd’hui
Bases d’Xcode
Bases de Swift
Swift sur iOS — Cours 1
Pourquoi Swift?
• Objective-C est vieux — 1983
• Très verbeux; séparation .h/.m; syntaxe unique
• Quelques évolutions du langage (ObjC 2, Modern ObjC,ARC)
• Swift est moderne, multiparadigme: orienté objet et fonctionnel
• Plus concis: simple de déclarer classes, méthodes, données, etc.
• Plus sûr: élimine (ou rend difficile) tout une série d’erreurs commune
avec ObjC
• Plus pratique: opérateurs, génériques, closures, etc.
• Approche fonctionnelle: code plus générique, plus facilement testable,
mieux adapté à des contextes d’exécution parallèle/concurrente
• Va probablement, à terme, remplacer ObjC
13
Swift sur iOS — Cours 1
Tester du code Swift
• Moyen le plus facile: un playground dans Xcode
— File → New → Playground
14
Code de test
Résultat de
chaque ligne
Output des
println()
Résultats multiples lors
d’une boucle
Swift sur iOS — Cours 1
Tester du code Swift
• Moyen le plus geek: le REPL (Read-Eval-Print-Loop) dans le terminal
— $	 swift pourYosemite
— $ xcrun swift pour Mavericks
15
Swift sur iOS — Cours 1
Disclaimer
• Peu de personnes le sont…
• Mais:
— Connaissance approfondie de Scala et de ses principes
fonctionnels
➡ La plupart sont utilisable tels quels dans Swift
— Connaissance des framework iOS
16
Je ne suis pas un expert de Swift!
Je note toutes les questions auxquelles je n’ai pas
réponse immédiatement pour la prochaine séance
Swift sur iOS — Cours 1
Syntaxe de base — let, var
17
Syntaxe indispensable uniquement; on verra d’autres éléments de
syntaxe plus tard avec l’introduction d’autres concepts
let s = "String"
let i = 4
let c = Character("a")
let d = 2.0
• Pas de point-virgule; pas de @"String"
• let introduit une «variable» constante
— Même déclaration avec var à la la place de let: réassignable
— Mais on préfère les constantes!
➡ Moins de variables sont modifiables, plus le programme sera facile à lire (et à
optimiser)
➡ La programmation purement fonctionnelle (p. ex. Haskell) n’a que l’équivalent
des let
Swift sur iOS — Cours 1
Syntaxe de base — variables et types
• Dans l’exemple, pas de type déclaré. Mais Swift est
statiquement typé!
— C’est le compilateur qui infère le type
— On peut le spécifier manuellement; par exemple
18
let s: String = "String"
let i: Int = 4
let c: Character = Character("a")
let d: Double = 2.0
• Ceci ne marche pas; chaque variable a un type et un seul
var s = "String"
s = 10
Un Int n’est pas un String!
Ceci n’est pas du JavaScriptCeci n’est pas du JavaScript
Swift sur iOS — Cours 1
Syntaxe de base — variables et types
• On déclare le type d’une variable:
— Pour forcer un type différent que ce que le compilateur infère
— Pour documenter son code
— Pour assigner une variable plus tard
19
var str: String
if 12 / 3 == 4 {
str = "yes"
} else {
str = "no"
}
let l: Int64 = 4 // pour forcer un Int sur 64 bits
let result: String = crypticFunction()
Swift sur iOS — Cours 1
Syntaxe de base — commentaires
20
// Voici un commentaire terminé par un retour (C++ style)
/* Voici un bloc commentaire, terminé explicitement,
qui peut faire plusieurs lignes (C style) */
// Aussi utilisable pour commenter du code:
/*
func doWork() {
// TODO: implémenter cette fonction
/* Les commentaires C sont imbricables */
}
*/
Ceci n’est la fin que du
commentaire imbriqué — normal…
mais pas pour tous les langages!
MARK, TODO dans le
menu Xcode
Swift sur iOS — Cours 1
Syntaxe de base — if
21
let myString: String = ...
if myString == "Hello" {
println("Hello to you, too")
} else if myString == "Good bye" {
println("See you around")
} else {
println("Come again, please?")
}
• La condition: if	 ...	 {	 } else	 if	 ...	 {	 }	 else	 {	 }

— Sans parenthèses pour la condition
— Accolades obligatoires…
➡ On se souvient du goto	 fail;
Swift sur iOS — Cours 1
Digression — goto fail;
22
. . .
hashOut.data = hashes + SSL_MD5_DIGEST_LEN;
hashOut.length = SSL_SHA1_DIGEST_LEN;
if ((err = SSLFreeBuffer(&hashCtx)) != 0)
goto fail;
if ((err = ReadyHash(&SSLHashSHA1, &hashCtx)) != 0)
goto fail;
if ((err = SSLHashSHA1.update(&hashCtx, &clientRandom)) != 0)
goto fail;
if ((err = SSLHashSHA1.update(&hashCtx, &serverRandom)) != 0)
goto fail;
if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
goto fail;
goto fail; /* MISTAKE! THIS LINE SHOULD NOT BE HERE */
if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0)
goto fail;
err = sslRawVerify(...);
. . .
Swift sur iOS — Cours 1
Syntaxe de base — for
• Boucle préférée: le for	 ...	 in	 ...	 {	 }
23
for index in 1...5 {
println("(index) times 5 is (index * 5)")
}
interpolation dans les strings!
let base = 3, power = 10
var answer = 1
for _ in 1...power {
answer *= base
}
println("(base) to the power of (power) is (answer)")
// "3 to the power of 10 is 59049"
• En ignorant la variable de boucle:
for var index = 0; index < 5; ++index {
println("index is (index)")
}
• Vieux style, avec var, à éviter
Swift sur iOS — Cours 1
Interpolation dans les strings
24
• Dans un string, le contenu entre ( et ) est évalué est
inséré dans le string directement
let user = "Steve"
let days = 3
let s1 = "posted by (user) (days) days ago"
NSString *user = @"Steve";
int days = 3;
NSString *s = [NSString stringWithFormat:@"posted by %@ %d days ago", user, days];
• En ObjC:
let w = 2
let h = 3
let s = "Area with sides (w) and (h) is (w * h)"
• Insertion d’expressions:
Swift sur iOS — Cours 1
Fonctions
• Les fonctions sont déclarées avec func
• Chaque paramètre indique son type
• Le type de retour, le cas échéant, est indiqué après ->
— Pas d’inférence des types ici
25
func sayHello(name: String) {
println("Hello, (name)!")
}
sayHello("Bill")
sayHello("Virginia")
func square(i: Int) -> Int {
return i * i
}
println(square(4))
println(square(32))
1 paramètre de type Int
Type de retour: Int
1 paramètre de type String
Type de retour: aucun
Void ou ()
Swift sur iOS — Cours 1
Fonctions
• Une fonction peut renvoyer plusieurs valeurs
— En fait, une seule valeur, mais de type Tuple
26
func firstAndLast(fullName: String) -> (first: String, last: String) {
if let range = fullName.rangeOfString(" ") {
let first = fullName.substringToIndex(range.startIndex)
let last = fullName.substringFromIndex(range.endIndex)
return (first, last)
} else {
return ("", "") // on fera mieux la semaine prochaine
}
}
let fullName = "Jean-Philippe Pellet"
let names = firstAndLast(fullName)
println("First name: (names.first); last name: (names.last)")
let (fst, lst) = firstAndLast(fullName)
println("First name: (fst); last name: (lst)")
type de retour (qui
nomme ses composants)
assignation du tuple à une
seule variable
assignation qui
déstructure le tuple
Swift sur iOS — Cours 1
Fonctions et variables
• Swift est fonctionnel: des paramètres peuvent être des
fonction, le type de retour peut être une fonction, les
variables peuvent contenir des fonctions…
— Dans ce sens, ressemble à JavaScript, mais avec des types
27
func makeGreeterFor(name: String) -> () -> Void {
return { () -> Void in
println("Hello, (name)!")
}
}
let greetLibby = makeGreeterFor("Libby")
greetLibby()
greetLibby()
makeGreeterFor("Hank")()
Type de retour de la fonction et
type de la variable: () ->Void —
«fonction qui ne prend aucun
argument et ne retourne rien»
Appels de la fonction stockée
dans la variable
Cet appel de fonction renvoie
une fonction
Appel direct de la fonction renvoyée
Swift sur iOS — Cours 1
• On appelle lambda une fonction anonyme déclarée pour être assignée à
une variable ou être retournée
• Un lambda, appelé closure lors de l’exécution, peut capturer des valeurs
de son contexte — ici, name

• Syntaxe générale:

{	 (ParamTypes)	 ->	 ReturnType	 in	 ...	 return	 ...	 }

— Les types peuvent être omis si le contexte est clair
— Le return peut être omis si une seule expression
— On peut utiliser les placeholders $0, $1, $2 à la place de nommer les arguments
Lambdas
28
func makeGreeterFor(name: String) -> () -> Void {
return { () -> Void in
println("Hello, (name)!")
}
}
Ceci est le lambda
Swift sur iOS — Cours 1
Lambdas, exemples
29
let mult1 = { (d1: Double, d2: Double) -> Double in
return d1 * d2
}
let mult2 = { (d1: Double, d2: Double) -> Double in d1 * d2 }
let mult3 = { (d1: Double, d2: Double) in d1 * d2 }
let mult4: (Double, Double) -> Double = { $0 * $1 }
let mult5: (Double, Double) -> Double = (*)
println(mult1(3.0, 4.0))
println(mult2(3.0, 4.0))
println(mult3(3.0, 4.0))
println(mult4(3.0, 4.0))
println(mult5(3.0, 4.0))
Déclaration complète
On omet le return
(une seule expression)
On omet le return et le type de retour
On omet le nom des paramètres,
le contexte est clair
Les 5 fonctions font exactement la même chose
On utilise directement le nom de
la fonction à appliquer
Swift sur iOS — Cours 1
Fonctions génériques
• Une fonction générique ne connaît pas forcément les
types qui la définissent lorsqu’on l’écrit
• Après son nom, on met entre <	 > les types inconnus
• Les génériques sont très puissants mais assez complexes.
Exemple simple:
30
func callFunction<A, B>(f: A -> B, argument: A) -> B {
return f(argument)
}
callFunction(sayHello, "Max")
let greetMax = callFunction(makeGreeterFor, "Frank")
greetMax()
«J’accepte une fonction f qui prend un A et
retourne un B, et j’accepte un A. J’applique f
et je retourne le B que f me donne»
Pour sayHello: A = String, B =Void

On ne fait rien du résultat
Pour makeGreeterFor: A = String, B = () ->Void

On stocke le résultat (une fonction) dans une
variable, puis on l’appelle
Swift sur iOS — Cours 1
Types génériques: Array et Dictionary
• Des types bien pratiques qui sont aussi génériques
— Array<T> ou [T], analogue de NSArray
— Dictionary<K,	 V> ou [K:	 V], analogue de NSDictionary
31
let squares: Array<Int> = [0, 1, 4, 9, 16]
let squaresDict: Dictionary<Int, String> = [
0: "zero",
1: "one",
4: "four",
9: "nine",
16: "sixteen"
]
for i in 0 ..< squares.endIndex {
let squareVal = squares[i]
if let squareString = squaresDict[squareVal] {
println("(i) squared is (squareVal) or (squareString)")
}
}
array literal avec la notation entre [ ]
let dit aussi: l’array n’est pas modifiable
Son type est Array<Int> ou [Int]
dictionary literal avec la notation avec [ : ]
Son type est Dictionary[Int, String] ou [Int: String]
On reparlera du if let plus loin
Deux notations pour créer des Range:
x ..< y (y exclusif)
x ... y (y inclusif)
On ne stocke rien d’autre que les types déclarés
dans ces structures (contrairement à ObjC)
Swift sur iOS — Cours 1
Array et Dictionary modifiables
32
var odds = [Int]()
for i in 1...11 {
odds.append(i * 2 - 1)
}
println(odds)
println(odds[3])
var numbers = [Int: String]()
numbers[1] = "un"
numbers[2] = "deux"
numbers[80] = "huitante"
numbers[80] = "quatre-vingts"
println(numbers)
let valueFor80: Optional<String> = numbers[80]
println(valueFor80)
let valueFor60 = numbers[60]
println(valueFor60)
Les parenthèses après le nom du type appellent le
constructeur et construisent ici une structure vide.
Pas de new, init, alloc
Méthode append() pour ajouter des éléments
subscript entre [ ] pour accéder à une position particulière
Constructeur
Optional<T> contient soit rien (nil), soit un T.
On en reparle à fond la semaine prochaine!
subscript pour ajouter des éléments et
accéder à la valeur associée à une clé
Swift sur iOS — Cours 1
Résumé: Cours 1
• Playground, REPL
• Variables, constantes
• Strings et interpolation
• Conditions, boucles
• Fonctions, types fonctions, lambdas
• Génériques (fonctions)
• Array, Dictionary
33
Swift sur iOS — Cours 1
La semaine prochaine (provisoire)
• Classes, structs, enums
• Protocoles 
• Pattern matching 
• Optionals, optional chaining, ?, !, ??
• Programmation fonctionnelle

avec filter, map, flatMap
34

Contenu connexe

Tendances

TypeScript for dummies
TypeScript for dummiesTypeScript for dummies
TypeScript for dummiesMicrosoft
 
Django pour les développeurs Symfony (et réciproquement)
Django pour les développeurs Symfony (et réciproquement)Django pour les développeurs Symfony (et réciproquement)
Django pour les développeurs Symfony (et réciproquement)Nicolas Perriault
 
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013Julien Jakubowski
 
Patterns and OOP in PHP
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHPjulien pauli
 
AlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHPAlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHPjulien pauli
 
Kevin Avignon: Roslyn - La plateforme de compilation .NET
Kevin Avignon: Roslyn - La plateforme de compilation .NETKevin Avignon: Roslyn - La plateforme de compilation .NET
Kevin Avignon: Roslyn - La plateforme de compilation .NETMSDEVMTL
 

Tendances (8)

TypeScript for dummies
TypeScript for dummiesTypeScript for dummies
TypeScript for dummies
 
Devoxx France - Nouvelles du Front
Devoxx France - Nouvelles du FrontDevoxx France - Nouvelles du Front
Devoxx France - Nouvelles du Front
 
Xcode 4.5
Xcode 4.5Xcode 4.5
Xcode 4.5
 
Django pour les développeurs Symfony (et réciproquement)
Django pour les développeurs Symfony (et réciproquement)Django pour les développeurs Symfony (et réciproquement)
Django pour les développeurs Symfony (et réciproquement)
 
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
 
Patterns and OOP in PHP
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHP
 
AlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHPAlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHP
 
Kevin Avignon: Roslyn - La plateforme de compilation .NET
Kevin Avignon: Roslyn - La plateforme de compilation .NETKevin Avignon: Roslyn - La plateforme de compilation .NET
Kevin Avignon: Roslyn - La plateforme de compilation .NET
 

En vedette

Android Bonnees pratiques
Android Bonnees pratiques Android Bonnees pratiques
Android Bonnees pratiques Patrick Bashizi
 
De java à swift en 2 temps trois mouvements
De java à swift en 2 temps trois mouvementsDe java à swift en 2 temps trois mouvements
De java à swift en 2 temps trois mouvementsDidier Plaindoux
 
Design Pattern
Design PatternDesign Pattern
Design Patternnewegg
 
Design Pattern: Développement et Bonnes pratiques
Design Pattern: Développement et Bonnes pratiquesDesign Pattern: Développement et Bonnes pratiques
Design Pattern: Développement et Bonnes pratiquesAlex Wilfried OUATTARA
 
Design Pattern lecture 2
Design Pattern lecture 2Design Pattern lecture 2
Design Pattern lecture 2Julie Iskander
 
Design patterns - Exemples en Java
Design patterns - Exemples en JavaDesign patterns - Exemples en Java
Design patterns - Exemples en JavaOussama BEN KHIROUN
 
Visitor Pattern
Visitor PatternVisitor Pattern
Visitor PatternIder Zheng
 
01 programmation mobile - android - (introduction)
01 programmation mobile - android - (introduction)01 programmation mobile - android - (introduction)
01 programmation mobile - android - (introduction)TECOS
 
Design Pattern introduction
Design Pattern introductionDesign Pattern introduction
Design Pattern introductionneuros
 
Chp6 - Développement iOS
Chp6 - Développement iOSChp6 - Développement iOS
Chp6 - Développement iOSLilia Sfaxi
 
Chp2 - Conception UX-UI des Applications Mobiles
Chp2 - Conception UX-UI des Applications MobilesChp2 - Conception UX-UI des Applications Mobiles
Chp2 - Conception UX-UI des Applications MobilesLilia Sfaxi
 
Chp5 - Applications Android
Chp5 - Applications AndroidChp5 - Applications Android
Chp5 - Applications AndroidLilia Sfaxi
 
Chp3 - Architecture Logicielle des Applications Mobiles
Chp3 - Architecture Logicielle des Applications MobilesChp3 - Architecture Logicielle des Applications Mobiles
Chp3 - Architecture Logicielle des Applications MobilesLilia Sfaxi
 
Chp1 - Introduction au Développement Mobile
Chp1 - Introduction au Développement MobileChp1 - Introduction au Développement Mobile
Chp1 - Introduction au Développement MobileLilia Sfaxi
 
Design Patterns (2003)
Design Patterns (2003)Design Patterns (2003)
Design Patterns (2003)Pascal Roques
 
A swift introduction to Swift
A swift introduction to SwiftA swift introduction to Swift
A swift introduction to SwiftGiordano Scalzo
 

En vedette (20)

Android Bonnees pratiques
Android Bonnees pratiques Android Bonnees pratiques
Android Bonnees pratiques
 
Sibtel&Swift
Sibtel&SwiftSibtel&Swift
Sibtel&Swift
 
De java à swift en 2 temps trois mouvements
De java à swift en 2 temps trois mouvementsDe java à swift en 2 temps trois mouvements
De java à swift en 2 temps trois mouvements
 
Design Pattern
Design PatternDesign Pattern
Design Pattern
 
Design Pattern: Développement et Bonnes pratiques
Design Pattern: Développement et Bonnes pratiquesDesign Pattern: Développement et Bonnes pratiques
Design Pattern: Développement et Bonnes pratiques
 
Design Pattern lecture 2
Design Pattern lecture 2Design Pattern lecture 2
Design Pattern lecture 2
 
Design pattern
Design patternDesign pattern
Design pattern
 
Design patterns - Exemples en Java
Design patterns - Exemples en JavaDesign patterns - Exemples en Java
Design patterns - Exemples en Java
 
Visitor Pattern
Visitor PatternVisitor Pattern
Visitor Pattern
 
01 programmation mobile - android - (introduction)
01 programmation mobile - android - (introduction)01 programmation mobile - android - (introduction)
01 programmation mobile - android - (introduction)
 
Design Pattern introduction
Design Pattern introductionDesign Pattern introduction
Design Pattern introduction
 
Chp6 - Développement iOS
Chp6 - Développement iOSChp6 - Développement iOS
Chp6 - Développement iOS
 
Chp2 - Conception UX-UI des Applications Mobiles
Chp2 - Conception UX-UI des Applications MobilesChp2 - Conception UX-UI des Applications Mobiles
Chp2 - Conception UX-UI des Applications Mobiles
 
Chp5 - Applications Android
Chp5 - Applications AndroidChp5 - Applications Android
Chp5 - Applications Android
 
Chp3 - Architecture Logicielle des Applications Mobiles
Chp3 - Architecture Logicielle des Applications MobilesChp3 - Architecture Logicielle des Applications Mobiles
Chp3 - Architecture Logicielle des Applications Mobiles
 
Chp1 - Introduction au Développement Mobile
Chp1 - Introduction au Développement MobileChp1 - Introduction au Développement Mobile
Chp1 - Introduction au Développement Mobile
 
Design Patterns (2003)
Design Patterns (2003)Design Patterns (2003)
Design Patterns (2003)
 
A swift introduction to Swift
A swift introduction to SwiftA swift introduction to Swift
A swift introduction to Swift
 
Jcom02.ppt
Jcom02.pptJcom02.ppt
Jcom02.ppt
 
Mobile design
Mobile designMobile design
Mobile design
 

Similaire à Cours1

Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et MobileNouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et MobileIppon
 
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et mobilité
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et mobilitéNouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et mobilité
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et mobilitéJulien Dubois
 
Vincent biret azure functions et flow (montreal)
Vincent biret azure functions et flow (montreal)Vincent biret azure functions et flow (montreal)
Vincent biret azure functions et flow (montreal)Vincent Biret
 
Développez dans le futur, dès maintenant !
Développez dans le futur, dès maintenant !Développez dans le futur, dès maintenant !
Développez dans le futur, dès maintenant !matparisot
 
Développez dans le futur, dès maintenant !
Développez dans le futur, dès maintenant !Développez dans le futur, dès maintenant !
Développez dans le futur, dès maintenant !Mathieu Parisot
 
Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...
Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...
Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...Normandie Web Xperts
 
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
 
Créer une API GraphQL avec Symfony
Créer une API GraphQL avec SymfonyCréer une API GraphQL avec Symfony
Créer une API GraphQL avec SymfonySébastien Rosset
 
Responsible Design ou Le web moderne à destination de tous
Responsible Design ou Le web moderne à destination de tousResponsible Design ou Le web moderne à destination de tous
Responsible Design ou Le web moderne à destination de tousjwajsberg
 
Hermes, génération et déploiement d'ipa by Peter Meuel
Hermes, génération et déploiement d'ipa by Peter MeuelHermes, génération et déploiement d'ipa by Peter Meuel
Hermes, génération et déploiement d'ipa by Peter MeuelCocoaHeads France
 
20131024 qualité de code et sonar - mug lyon
20131024   qualité de code et sonar - mug lyon20131024   qualité de code et sonar - mug lyon
20131024 qualité de code et sonar - mug lyonClement Bouillier
 
10 tips pour améliorer les performances de vos applications Windows 8
10 tips pour améliorer les performances de vos applications Windows 810 tips pour améliorer les performances de vos applications Windows 8
10 tips pour améliorer les performances de vos applications Windows 8Microsoft
 
Une introduction à Javascript et ECMAScript 6
Une introduction à Javascript et ECMAScript 6Une introduction à Javascript et ECMAScript 6
Une introduction à Javascript et ECMAScript 6Jean-Baptiste Vigneron
 
.Net pour le développeur Java - une source d'inspiration?
.Net pour le développeur Java - une source d'inspiration?.Net pour le développeur Java - une source d'inspiration?
.Net pour le développeur Java - une source d'inspiration?Rui Carvalho
 
Le développement web : tour d'horizon
Le développement web : tour d'horizonLe développement web : tour d'horizon
Le développement web : tour d'horizonMicrosoft
 

Similaire à Cours1 (20)

Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et MobileNouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
 
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et mobilité
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et mobilitéNouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et mobilité
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et mobilité
 
La Rochelle workshop 2016
La Rochelle workshop 2016La Rochelle workshop 2016
La Rochelle workshop 2016
 
Vincent biret azure functions et flow (montreal)
Vincent biret azure functions et flow (montreal)Vincent biret azure functions et flow (montreal)
Vincent biret azure functions et flow (montreal)
 
Développez dans le futur, dès maintenant !
Développez dans le futur, dès maintenant !Développez dans le futur, dès maintenant !
Développez dans le futur, dès maintenant !
 
Développez dans le futur, dès maintenant !
Développez dans le futur, dès maintenant !Développez dans le futur, dès maintenant !
Développez dans le futur, dès maintenant !
 
GetText / Rails - FR
GetText / Rails - FRGetText / Rails - FR
GetText / Rails - FR
 
GetText / Rails
GetText / RailsGetText / Rails
GetText / Rails
 
Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...
Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...
Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...
 
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)
 
Créer une API GraphQL avec Symfony
Créer une API GraphQL avec SymfonyCréer une API GraphQL avec Symfony
Créer une API GraphQL avec Symfony
 
Responsible Design ou Le web moderne à destination de tous
Responsible Design ou Le web moderne à destination de tousResponsible Design ou Le web moderne à destination de tous
Responsible Design ou Le web moderne à destination de tous
 
Hermes, génération et déploiement d'ipa by Peter Meuel
Hermes, génération et déploiement d'ipa by Peter MeuelHermes, génération et déploiement d'ipa by Peter Meuel
Hermes, génération et déploiement d'ipa by Peter Meuel
 
20131024 qualité de code et sonar - mug lyon
20131024   qualité de code et sonar - mug lyon20131024   qualité de code et sonar - mug lyon
20131024 qualité de code et sonar - mug lyon
 
10 tips pour améliorer les performances de vos applications Windows 8
10 tips pour améliorer les performances de vos applications Windows 810 tips pour améliorer les performances de vos applications Windows 8
10 tips pour améliorer les performances de vos applications Windows 8
 
Rails 3 au Djangocong
Rails 3 au DjangocongRails 3 au Djangocong
Rails 3 au Djangocong
 
Compte rendu Blend Web Mix 2015
Compte rendu Blend Web Mix 2015Compte rendu Blend Web Mix 2015
Compte rendu Blend Web Mix 2015
 
Une introduction à Javascript et ECMAScript 6
Une introduction à Javascript et ECMAScript 6Une introduction à Javascript et ECMAScript 6
Une introduction à Javascript et ECMAScript 6
 
.Net pour le développeur Java - une source d'inspiration?
.Net pour le développeur Java - une source d'inspiration?.Net pour le développeur Java - une source d'inspiration?
.Net pour le développeur Java - une source d'inspiration?
 
Le développement web : tour d'horizon
Le développement web : tour d'horizonLe développement web : tour d'horizon
Le développement web : tour d'horizon
 

Dernier

Cours SE Le système Linux : La ligne de commande bash - IG IPSET
Cours SE Le système Linux : La ligne de commande bash - IG IPSETCours SE Le système Linux : La ligne de commande bash - IG IPSET
Cours SE Le système Linux : La ligne de commande bash - IG IPSETMedBechir
 
Fondation Louis Vuitton. pptx
Fondation      Louis      Vuitton.   pptxFondation      Louis      Vuitton.   pptx
Fondation Louis Vuitton. pptxTxaruka
 
Saint Georges, martyr, et la lègend du dragon.pptx
Saint Georges, martyr, et la lègend du dragon.pptxSaint Georges, martyr, et la lègend du dragon.pptx
Saint Georges, martyr, et la lègend du dragon.pptxMartin M Flynn
 
Cours SE Gestion des périphériques - IG IPSET
Cours SE Gestion des périphériques - IG IPSETCours SE Gestion des périphériques - IG IPSET
Cours SE Gestion des périphériques - IG IPSETMedBechir
 
systeme expert_systeme expert_systeme expert
systeme expert_systeme expert_systeme expertsysteme expert_systeme expert_systeme expert
systeme expert_systeme expert_systeme expertChristianMbip
 
7 PPT sue le project de fin d'étude.pptx
7 PPT sue le project de fin d'étude.pptx7 PPT sue le project de fin d'étude.pptx
7 PPT sue le project de fin d'étude.pptxrababouerdighi
 
A3iFormations, organisme de formations certifié qualiopi.
A3iFormations, organisme de formations certifié qualiopi.A3iFormations, organisme de formations certifié qualiopi.
A3iFormations, organisme de formations certifié qualiopi.Franck Apolis
 
666148532-Formation-Habilitation-ELECTRIQUE-ENTREPRISE-MARS-2017.pptx
666148532-Formation-Habilitation-ELECTRIQUE-ENTREPRISE-MARS-2017.pptx666148532-Formation-Habilitation-ELECTRIQUE-ENTREPRISE-MARS-2017.pptx
666148532-Formation-Habilitation-ELECTRIQUE-ENTREPRISE-MARS-2017.pptxSAID MASHATE
 
Evaluation du systeme d'Education. Marocpptx
Evaluation du systeme d'Education. MarocpptxEvaluation du systeme d'Education. Marocpptx
Evaluation du systeme d'Education. MarocpptxAsmaa105193
 
Guide Final de rédaction de mémoire de fin d'étude
Guide Final de rédaction de mémoire de fin d'étudeGuide Final de rédaction de mémoire de fin d'étude
Guide Final de rédaction de mémoire de fin d'étudeBenamraneMarwa
 
Présentation_ Didactique 1_SVT (S4) complet.pptx
Présentation_ Didactique 1_SVT (S4) complet.pptxPrésentation_ Didactique 1_SVT (S4) complet.pptx
Présentation_ Didactique 1_SVT (S4) complet.pptxrababouerdighi
 
Annie Ernaux Extérieurs. pptx. Exposition basée sur un livre .
Annie   Ernaux  Extérieurs. pptx. Exposition basée sur un livre .Annie   Ernaux  Extérieurs. pptx. Exposition basée sur un livre .
Annie Ernaux Extérieurs. pptx. Exposition basée sur un livre .Txaruka
 
Formation M2i - Comprendre les neurosciences pour développer son leadership
Formation M2i - Comprendre les neurosciences pour développer son leadershipFormation M2i - Comprendre les neurosciences pour développer son leadership
Formation M2i - Comprendre les neurosciences pour développer son leadershipM2i Formation
 

Dernier (15)

Cours SE Le système Linux : La ligne de commande bash - IG IPSET
Cours SE Le système Linux : La ligne de commande bash - IG IPSETCours SE Le système Linux : La ligne de commande bash - IG IPSET
Cours SE Le système Linux : La ligne de commande bash - IG IPSET
 
Fondation Louis Vuitton. pptx
Fondation      Louis      Vuitton.   pptxFondation      Louis      Vuitton.   pptx
Fondation Louis Vuitton. pptx
 
Saint Georges, martyr, et la lègend du dragon.pptx
Saint Georges, martyr, et la lègend du dragon.pptxSaint Georges, martyr, et la lègend du dragon.pptx
Saint Georges, martyr, et la lègend du dragon.pptx
 
Pâques de Sainte Marie-Euphrasie Pelletier
Pâques de Sainte Marie-Euphrasie PelletierPâques de Sainte Marie-Euphrasie Pelletier
Pâques de Sainte Marie-Euphrasie Pelletier
 
Cours SE Gestion des périphériques - IG IPSET
Cours SE Gestion des périphériques - IG IPSETCours SE Gestion des périphériques - IG IPSET
Cours SE Gestion des périphériques - IG IPSET
 
systeme expert_systeme expert_systeme expert
systeme expert_systeme expert_systeme expertsysteme expert_systeme expert_systeme expert
systeme expert_systeme expert_systeme expert
 
7 PPT sue le project de fin d'étude.pptx
7 PPT sue le project de fin d'étude.pptx7 PPT sue le project de fin d'étude.pptx
7 PPT sue le project de fin d'étude.pptx
 
A3iFormations, organisme de formations certifié qualiopi.
A3iFormations, organisme de formations certifié qualiopi.A3iFormations, organisme de formations certifié qualiopi.
A3iFormations, organisme de formations certifié qualiopi.
 
666148532-Formation-Habilitation-ELECTRIQUE-ENTREPRISE-MARS-2017.pptx
666148532-Formation-Habilitation-ELECTRIQUE-ENTREPRISE-MARS-2017.pptx666148532-Formation-Habilitation-ELECTRIQUE-ENTREPRISE-MARS-2017.pptx
666148532-Formation-Habilitation-ELECTRIQUE-ENTREPRISE-MARS-2017.pptx
 
Evaluation du systeme d'Education. Marocpptx
Evaluation du systeme d'Education. MarocpptxEvaluation du systeme d'Education. Marocpptx
Evaluation du systeme d'Education. Marocpptx
 
Evaluación Alumnos de Ecole Victor Hugo
Evaluación Alumnos de Ecole  Victor HugoEvaluación Alumnos de Ecole  Victor Hugo
Evaluación Alumnos de Ecole Victor Hugo
 
Guide Final de rédaction de mémoire de fin d'étude
Guide Final de rédaction de mémoire de fin d'étudeGuide Final de rédaction de mémoire de fin d'étude
Guide Final de rédaction de mémoire de fin d'étude
 
Présentation_ Didactique 1_SVT (S4) complet.pptx
Présentation_ Didactique 1_SVT (S4) complet.pptxPrésentation_ Didactique 1_SVT (S4) complet.pptx
Présentation_ Didactique 1_SVT (S4) complet.pptx
 
Annie Ernaux Extérieurs. pptx. Exposition basée sur un livre .
Annie   Ernaux  Extérieurs. pptx. Exposition basée sur un livre .Annie   Ernaux  Extérieurs. pptx. Exposition basée sur un livre .
Annie Ernaux Extérieurs. pptx. Exposition basée sur un livre .
 
Formation M2i - Comprendre les neurosciences pour développer son leadership
Formation M2i - Comprendre les neurosciences pour développer son leadershipFormation M2i - Comprendre les neurosciences pour développer son leadership
Formation M2i - Comprendre les neurosciences pour développer son leadership
 

Cours1

  • 1. Développement iOS avec Swift Jean-Philippe Pellet HEP-VD, Cours 1, 28 janvier 2015 1
  • 2. Swift sur iOS — Cours 1 Présentations • Jean-Philippe Pellet, M.Sc. en informatique à l’EPFL,
 Ph.D. à l’ETH Zurich/IBM Research • Développement C, C++, Java, JavaScript, Objective-C, Scala • Depuis 2010:Wizbee, plateforme pédagogique, en Scala • Depuis 2011: Cours de Java au 1er semestre EPFL • Depuis 2013: HEPVaud, développements pédagogiques 2
  • 3. Swift sur iOS — Cours 1 Organisation • Horaire sur Google Drive • Dossier partagé avec slides, exemple de code, etc. ➡ http://bit.ly/swift-hep • Alternance entre sessions «cours» et
 sessions «projet» — Cours: 1 période de présentation, 1 période d’exercices ➡ Les exercices sont indépendants de tout projet — Projet: 2-4 périodes de travail individuel «coaché» ➡ Optionnel, mais recommandé ➡ Selon vos projets personnels d’app ou des projets à définir ensemble ➡ Commande groupée de pizzas pour ceux qui font la soirée 3
  • 4. Swift sur iOS — Cours 1 Prérequis • OS X Mavericks (10.9.4+) ou Yosemite (10.10.1+) • Xcode 6.1.1 • Pour les tests en vrai: un iPad ou iPhone avec iOS 8 — Sinon, les tests se font dans le simulateur — Le simulateur ne simule pas tout (accéléromètre, location, compas, etc.) — Possibilité limitée d’emprunter des iPads de l’UER
 (pendant les horaires du cours uniquement) • Des connaissances de base en programmation — Pas d’introduction aux principes des variables, des méthodes/ fonctions ou des classes/objets 4
  • 5. Swift sur iOS — Cours 1 Thèmes proposés • Bases d’Xcode, bases de Swift • Swift plus en détails, programmation fonctionnelle • Storyboards,Autolayout,View controllers • Coaching technique; pizzas à 19h • UITableView, données, gestes • Widgets personnalisés, librairies utiles • Coaching technique; pizzas à 19h • Senseurs, CoreLocation • Transitions, animations • Coaching technique; pizzas à 19h • CloudKit, CoreData • Coaching technique; pizzas à 19h 5
  • 6. Swift sur iOS — Cours 1 Mode • Introduction d’un concept avec un morceau de code commenté • Discussion du concept sans forcément aller dans tous les détails • Le cours n’a pas la forme d’une référence — Plus de découvertes illustrées par du code 6
  • 7. Swift sur iOS — Cours 1 Références — livres (I) • Swift (indépendamment d’iOS) — The Swift Programming Language (ebook, env. 600 p.) ➡ La très bonne référence gratuite et complète d’Apple — Swift in 24 Hours, Sams TeachYourself (420 p.) ➡ Excellente description quasi exhaustive de Swift ➡ Exercices, exemples courts et moyens — Swift Fundamentals:The Language of iOS Development (260 p.) ➡ Exercices rapides, description pragmatique du langage ➡ Qualité moyenne de mise en page 7
  • 8. Swift sur iOS — Cours 1 Références — livres (II) • iOS en Swift (avec exemples spécifiques) — Beginning iPhone Development with Swift (800 p.) ➡ Toute une série d’introductions et exemples pratiques sur des API de base (interface graphique, persistence des données, dessin à l’écran — iOS 8 Swift Programming Cookbook (870 p.) ➡ Série de chapitre de type use case – discussion – code. Pratique pour copier-coller initial pour facilement tester une série d’APIs — iOS 8 for Programmers:An App-Driven Approach with Swift (350 p.) ➡ 7 apps complètes expliquées en détails 8
  • 9. Swift sur iOS — Cours 1 Références — Blogs • https://developer.apple.com/swift/blog/  — Le blog d’Apple, pas extrêmement actif mais informatif et facile à lire • http://airspeedvelocity.net, http://nomothetis.svbtle.com — S’intéressent de près au langage en profondeur • http://robnapier.net  — Pas toujours beaucoup de code, discussions plus générales sur la programmation fonctionnelle et ses paradigmes 9
  • 10. Swift sur iOS — Cours 1 Références — Autres sites • http://swiftdoc.org  ➡ Documentation HTML générée automatiquement pour ce que Swift prédéfinit • Swift Cheat Sheet ➡ Les bases résumées • http://www.raywenderlich.com ➡ Une incroyable collection de tutoriels en ObjC ou Swift pour iOS • Design patterns in Swift  ➡ Approche objet-fonctionnelle des design patterns classiques • https://github.com/pNre/ExSwift ➡ Des extensions aux types et collections de base • https://thatthinginswift.com ➡ Je sais le faire en ObjC, mais pas en Swift… 10
  • 11. Swift sur iOS — Cours 1 Références — Twitter • @clattner_llvm — irrégulier, créateur de Swift • @SwiftLang — 3–4x par mois • @NSHipster — 2–3x par mois • @mattt — 1–2x par mois • @codinginswift — 1–2x par jour • @AirspeedSwift — tous les 1–2 jours • @cocoaphony — tous les 1–2 jours, pas que Swift • @SwiftDevs — irrégulier • @XcodeTips — irrégulier, Xcode 11
  • 13. Swift sur iOS — Cours 1 Pourquoi Swift? • Objective-C est vieux — 1983 • Très verbeux; séparation .h/.m; syntaxe unique • Quelques évolutions du langage (ObjC 2, Modern ObjC,ARC) • Swift est moderne, multiparadigme: orienté objet et fonctionnel • Plus concis: simple de déclarer classes, méthodes, données, etc. • Plus sûr: élimine (ou rend difficile) tout une série d’erreurs commune avec ObjC • Plus pratique: opérateurs, génériques, closures, etc. • Approche fonctionnelle: code plus générique, plus facilement testable, mieux adapté à des contextes d’exécution parallèle/concurrente • Va probablement, à terme, remplacer ObjC 13
  • 14. Swift sur iOS — Cours 1 Tester du code Swift • Moyen le plus facile: un playground dans Xcode — File → New → Playground 14 Code de test Résultat de chaque ligne Output des println() Résultats multiples lors d’une boucle
  • 15. Swift sur iOS — Cours 1 Tester du code Swift • Moyen le plus geek: le REPL (Read-Eval-Print-Loop) dans le terminal — $ swift pourYosemite — $ xcrun swift pour Mavericks 15
  • 16. Swift sur iOS — Cours 1 Disclaimer • Peu de personnes le sont… • Mais: — Connaissance approfondie de Scala et de ses principes fonctionnels ➡ La plupart sont utilisable tels quels dans Swift — Connaissance des framework iOS 16 Je ne suis pas un expert de Swift! Je note toutes les questions auxquelles je n’ai pas réponse immédiatement pour la prochaine séance
  • 17. Swift sur iOS — Cours 1 Syntaxe de base — let, var 17 Syntaxe indispensable uniquement; on verra d’autres éléments de syntaxe plus tard avec l’introduction d’autres concepts let s = "String" let i = 4 let c = Character("a") let d = 2.0 • Pas de point-virgule; pas de @"String" • let introduit une «variable» constante — Même déclaration avec var à la la place de let: réassignable — Mais on préfère les constantes! ➡ Moins de variables sont modifiables, plus le programme sera facile à lire (et à optimiser) ➡ La programmation purement fonctionnelle (p. ex. Haskell) n’a que l’équivalent des let
  • 18. Swift sur iOS — Cours 1 Syntaxe de base — variables et types • Dans l’exemple, pas de type déclaré. Mais Swift est statiquement typé! — C’est le compilateur qui infère le type — On peut le spécifier manuellement; par exemple 18 let s: String = "String" let i: Int = 4 let c: Character = Character("a") let d: Double = 2.0 • Ceci ne marche pas; chaque variable a un type et un seul var s = "String" s = 10 Un Int n’est pas un String! Ceci n’est pas du JavaScriptCeci n’est pas du JavaScript
  • 19. Swift sur iOS — Cours 1 Syntaxe de base — variables et types • On déclare le type d’une variable: — Pour forcer un type différent que ce que le compilateur infère — Pour documenter son code — Pour assigner une variable plus tard 19 var str: String if 12 / 3 == 4 { str = "yes" } else { str = "no" } let l: Int64 = 4 // pour forcer un Int sur 64 bits let result: String = crypticFunction()
  • 20. Swift sur iOS — Cours 1 Syntaxe de base — commentaires 20 // Voici un commentaire terminé par un retour (C++ style) /* Voici un bloc commentaire, terminé explicitement, qui peut faire plusieurs lignes (C style) */ // Aussi utilisable pour commenter du code: /* func doWork() { // TODO: implémenter cette fonction /* Les commentaires C sont imbricables */ } */ Ceci n’est la fin que du commentaire imbriqué — normal… mais pas pour tous les langages! MARK, TODO dans le menu Xcode
  • 21. Swift sur iOS — Cours 1 Syntaxe de base — if 21 let myString: String = ... if myString == "Hello" { println("Hello to you, too") } else if myString == "Good bye" { println("See you around") } else { println("Come again, please?") } • La condition: if ... { } else if ... { } else { } — Sans parenthèses pour la condition — Accolades obligatoires… ➡ On se souvient du goto fail;
  • 22. Swift sur iOS — Cours 1 Digression — goto fail; 22 . . . hashOut.data = hashes + SSL_MD5_DIGEST_LEN; hashOut.length = SSL_SHA1_DIGEST_LEN; if ((err = SSLFreeBuffer(&hashCtx)) != 0) goto fail; if ((err = ReadyHash(&SSLHashSHA1, &hashCtx)) != 0) goto fail; if ((err = SSLHashSHA1.update(&hashCtx, &clientRandom)) != 0) goto fail; if ((err = SSLHashSHA1.update(&hashCtx, &serverRandom)) != 0) goto fail; if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0) goto fail; goto fail; /* MISTAKE! THIS LINE SHOULD NOT BE HERE */ if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0) goto fail; err = sslRawVerify(...); . . .
  • 23. Swift sur iOS — Cours 1 Syntaxe de base — for • Boucle préférée: le for ... in ... { } 23 for index in 1...5 { println("(index) times 5 is (index * 5)") } interpolation dans les strings! let base = 3, power = 10 var answer = 1 for _ in 1...power { answer *= base } println("(base) to the power of (power) is (answer)") // "3 to the power of 10 is 59049" • En ignorant la variable de boucle: for var index = 0; index < 5; ++index { println("index is (index)") } • Vieux style, avec var, à éviter
  • 24. Swift sur iOS — Cours 1 Interpolation dans les strings 24 • Dans un string, le contenu entre ( et ) est évalué est inséré dans le string directement let user = "Steve" let days = 3 let s1 = "posted by (user) (days) days ago" NSString *user = @"Steve"; int days = 3; NSString *s = [NSString stringWithFormat:@"posted by %@ %d days ago", user, days]; • En ObjC: let w = 2 let h = 3 let s = "Area with sides (w) and (h) is (w * h)" • Insertion d’expressions:
  • 25. Swift sur iOS — Cours 1 Fonctions • Les fonctions sont déclarées avec func • Chaque paramètre indique son type • Le type de retour, le cas échéant, est indiqué après -> — Pas d’inférence des types ici 25 func sayHello(name: String) { println("Hello, (name)!") } sayHello("Bill") sayHello("Virginia") func square(i: Int) -> Int { return i * i } println(square(4)) println(square(32)) 1 paramètre de type Int Type de retour: Int 1 paramètre de type String Type de retour: aucun Void ou ()
  • 26. Swift sur iOS — Cours 1 Fonctions • Une fonction peut renvoyer plusieurs valeurs — En fait, une seule valeur, mais de type Tuple 26 func firstAndLast(fullName: String) -> (first: String, last: String) { if let range = fullName.rangeOfString(" ") { let first = fullName.substringToIndex(range.startIndex) let last = fullName.substringFromIndex(range.endIndex) return (first, last) } else { return ("", "") // on fera mieux la semaine prochaine } } let fullName = "Jean-Philippe Pellet" let names = firstAndLast(fullName) println("First name: (names.first); last name: (names.last)") let (fst, lst) = firstAndLast(fullName) println("First name: (fst); last name: (lst)") type de retour (qui nomme ses composants) assignation du tuple à une seule variable assignation qui déstructure le tuple
  • 27. Swift sur iOS — Cours 1 Fonctions et variables • Swift est fonctionnel: des paramètres peuvent être des fonction, le type de retour peut être une fonction, les variables peuvent contenir des fonctions… — Dans ce sens, ressemble à JavaScript, mais avec des types 27 func makeGreeterFor(name: String) -> () -> Void { return { () -> Void in println("Hello, (name)!") } } let greetLibby = makeGreeterFor("Libby") greetLibby() greetLibby() makeGreeterFor("Hank")() Type de retour de la fonction et type de la variable: () ->Void — «fonction qui ne prend aucun argument et ne retourne rien» Appels de la fonction stockée dans la variable Cet appel de fonction renvoie une fonction Appel direct de la fonction renvoyée
  • 28. Swift sur iOS — Cours 1 • On appelle lambda une fonction anonyme déclarée pour être assignée à une variable ou être retournée • Un lambda, appelé closure lors de l’exécution, peut capturer des valeurs de son contexte — ici, name • Syntaxe générale:
 { (ParamTypes) -> ReturnType in ... return ... } — Les types peuvent être omis si le contexte est clair — Le return peut être omis si une seule expression — On peut utiliser les placeholders $0, $1, $2 à la place de nommer les arguments Lambdas 28 func makeGreeterFor(name: String) -> () -> Void { return { () -> Void in println("Hello, (name)!") } } Ceci est le lambda
  • 29. Swift sur iOS — Cours 1 Lambdas, exemples 29 let mult1 = { (d1: Double, d2: Double) -> Double in return d1 * d2 } let mult2 = { (d1: Double, d2: Double) -> Double in d1 * d2 } let mult3 = { (d1: Double, d2: Double) in d1 * d2 } let mult4: (Double, Double) -> Double = { $0 * $1 } let mult5: (Double, Double) -> Double = (*) println(mult1(3.0, 4.0)) println(mult2(3.0, 4.0)) println(mult3(3.0, 4.0)) println(mult4(3.0, 4.0)) println(mult5(3.0, 4.0)) Déclaration complète On omet le return (une seule expression) On omet le return et le type de retour On omet le nom des paramètres, le contexte est clair Les 5 fonctions font exactement la même chose On utilise directement le nom de la fonction à appliquer
  • 30. Swift sur iOS — Cours 1 Fonctions génériques • Une fonction générique ne connaît pas forcément les types qui la définissent lorsqu’on l’écrit • Après son nom, on met entre < > les types inconnus • Les génériques sont très puissants mais assez complexes. Exemple simple: 30 func callFunction<A, B>(f: A -> B, argument: A) -> B { return f(argument) } callFunction(sayHello, "Max") let greetMax = callFunction(makeGreeterFor, "Frank") greetMax() «J’accepte une fonction f qui prend un A et retourne un B, et j’accepte un A. J’applique f et je retourne le B que f me donne» Pour sayHello: A = String, B =Void
 On ne fait rien du résultat Pour makeGreeterFor: A = String, B = () ->Void
 On stocke le résultat (une fonction) dans une variable, puis on l’appelle
  • 31. Swift sur iOS — Cours 1 Types génériques: Array et Dictionary • Des types bien pratiques qui sont aussi génériques — Array<T> ou [T], analogue de NSArray — Dictionary<K, V> ou [K: V], analogue de NSDictionary 31 let squares: Array<Int> = [0, 1, 4, 9, 16] let squaresDict: Dictionary<Int, String> = [ 0: "zero", 1: "one", 4: "four", 9: "nine", 16: "sixteen" ] for i in 0 ..< squares.endIndex { let squareVal = squares[i] if let squareString = squaresDict[squareVal] { println("(i) squared is (squareVal) or (squareString)") } } array literal avec la notation entre [ ] let dit aussi: l’array n’est pas modifiable Son type est Array<Int> ou [Int] dictionary literal avec la notation avec [ : ] Son type est Dictionary[Int, String] ou [Int: String] On reparlera du if let plus loin Deux notations pour créer des Range: x ..< y (y exclusif) x ... y (y inclusif) On ne stocke rien d’autre que les types déclarés dans ces structures (contrairement à ObjC)
  • 32. Swift sur iOS — Cours 1 Array et Dictionary modifiables 32 var odds = [Int]() for i in 1...11 { odds.append(i * 2 - 1) } println(odds) println(odds[3]) var numbers = [Int: String]() numbers[1] = "un" numbers[2] = "deux" numbers[80] = "huitante" numbers[80] = "quatre-vingts" println(numbers) let valueFor80: Optional<String> = numbers[80] println(valueFor80) let valueFor60 = numbers[60] println(valueFor60) Les parenthèses après le nom du type appellent le constructeur et construisent ici une structure vide. Pas de new, init, alloc Méthode append() pour ajouter des éléments subscript entre [ ] pour accéder à une position particulière Constructeur Optional<T> contient soit rien (nil), soit un T. On en reparle à fond la semaine prochaine! subscript pour ajouter des éléments et accéder à la valeur associée à une clé
  • 33. Swift sur iOS — Cours 1 Résumé: Cours 1 • Playground, REPL • Variables, constantes • Strings et interpolation • Conditions, boucles • Fonctions, types fonctions, lambdas • Génériques (fonctions) • Array, Dictionary 33
  • 34. Swift sur iOS — Cours 1 La semaine prochaine (provisoire) • Classes, structs, enums • Protocoles  • Pattern matching  • Optionals, optional chaining, ?, !, ?? • Programmation fonctionnelle
 avec filter, map, flatMap 34