Apprendre le SWIFT iOS

INTRODUCTION

« Swift est un nouveau langage de programmation innovant pour Cocoa et CocoaTouch.
L’écriture du code est interactive et ludique, la syntaxe est concise et expressive, et les applications deviennent ultra-rapides. Swift est prêt pour vos prochains projets iOS et OSX – ou pour votre application actuelle – parce que le code swift travaille côte à côte avec Objective-C. ».
Une très belle introduction by Apple.

Swift est compatible avec Objective-C mais je vous propose de créer des applications complètement en Swift pour profiter de ce nouveau langage qui a pris près de 2ans pour se construire et sorti officiellement début Juin. C’est un langage très très ambitieux et moderne.

Les bases

Autant vous dire que si vous n’avez jamais fait de programmation avant, vous ne comprendrez pas tout mais vous saurez le faire :) Je vous conseille de vous renseigner sur la programmation orientée objet, les classes et les procédures.
Comme vous vous en doutez, vous ne pourrez compiler des codes en swift que sur un ordinateur Apple (ou autres variantes PC Mac..). C’est très simple et pour vous le prouver, un simple affichage de texte dans la console ce fait comme cela :
en Objective-C:

int main() {
printf("Hello, World!");
}

puis en Swift:

print("Hello, World!")

Comme vous pouvez le voir, il n’y a même pas de  » ;  » ce qui est une grande avancée dans le monde de la programmation ! Il faut savoir que tous les développeurs sont fainéants, il faut coder le moins possible 🙂
Malheureusement, pour apprendre un langage, mieux vaut ne pas être fainéant donc commençons les choses sérieuses.

LES VARIABLES

Swift est intelligent, ça veut dire que pour déclarer une variable, il n’y a que deux constantes,  » let  » et  » var « .
Elles peuvent toutes les deux contenir des chiffres, des nombres

//Déclaration d'une variable nommée " variable1 " que l'on ne pourra jamais modifier:
let variable1 = 1

//Déclaration d'une variable " variable2 " modifiable :
var variable2 = 2

et aussi une chaîne de caractères ou une lettre.

let variable3 = "Salut"
var variable4 = "Toto"

Les nombres à virgule fonctionnent aussi

var variable5 = 1.3
var variable6 = 2.0

Vous avez pu le voir, il y a deux constantes  » let  » et  » var  » et elles ont toutes 3 types. Leurs types étant mis automatiquement, nous n’avons pas besoin de les préciser.
Cependant, il est parfois utile de le préciser. Les variables ci-dessus s’écrivent donc:

var variable1:Int = 1
var variable2:Int = 2

let variable3:String = "Salut"
var variable4:String = "Toto"

var variable5:Double = 1.3
var variable6:Double = 2

Voici les calculs que nous pouvons faire. Pour l’exemple, j’utilise les variables initiées ci-dessus.

//On peut ajouter la somme de plusieurs variables dans une autre variable du même type
var somme_des_nombresEntiers = variable1 + variable2 var somme_des_nombresVirgule = variable5 + variable6 //On peut ajouter la division de plusieurs variables dans une autre variable du même type var division_des_nombresEntiers = variable1 / variable2 var division_des_nombresVirgule = variable5 / variable6 //On peut ajouter la multiplication de plusieurs variables dans une autre variable du même type var multiplication_des_nombresEntiers = variable1 * variable2 var multiplication_des_nombresVirgule = variable5 * variable6 //Et bien-sûr des soustractions, faire plusieurs calculs dans u
ne même variable: //(Plus d'informations sur la vidéo) var test_calculs:Double = (3+6) / 4.6 //Pour afficher quelque chose à l'écran, on utilise print(). print(variable3+" "+variable4) print(", la somme") println(" de nos nombres entiers vaut (somme_des_nombresEntiers) et ceux des virgules vaut (somme_des_nombresVirgule)") print("Mon calcul test est : (test_calculs) et affiché en Int: (Int(test_calculs)) mais sa valeur vaut toujours (test_calculs). Maintenant, je vais convertir dans une autre variable : ") var test_calculs_int = Int(test_calculs) print(test_calculs_int) var test_calculs_int_bonneConversion = Int(round(test_calculs)) print(". nAvec une meilleure conversion: (test_calculs_int_bonneConversion)") /* Notons que println() engage un retour à la ligne contrairement à print(). Si vous souhaitez faire un ou plusieurs retours à la ligne dans le même print() ou println(), il suffit d'ajouter " n ". */

Salut Toto, la somme de nos nombres entiers vaut 3 et celle des virgules vaut 3.3
Mon calcul test est : 1.95652173913044 et affiché en Int: 1 mais sa valeur vaut toujours 1.95652173913044. Maintenant, je vais convertir dans une autre variable : 1.
Avec une meilleure conversion: 2

LES TABLEAUX

Vous auriez peut-être besoin d’une liste des variables dans votre application. On appelle une liste un Tableau.

println("J'ai maintenant (courses.count) articles à acheter et la première chose est toujours (courses[0]) 
")

courses[0]="1 pack d'Oasis" //Je modifie la première valeur de mon tableau

print("J'ai toujours (courses.count) articles à acheter mais j'ai modifier le premier par (courses[0])")

J'ai 6 articles à acheter et la première chose est pain de mie

J'ai maintenant 7 articles à acheter et la première chose est toujours pain de mie

J'ai toujours 7 articles à acheter mais j'ai modifié le premier par 1 pack d'Oasis

Il peut aussi arriver que vous vouliez ajouter votre propre numéro à votre valeur.

var courses = ["MonPremierArticle":"pain de mie", "Confiture":"Confiture de fraises", "Test":1, "MonAutreArticle":"Nutella", 4232:"Haricots vert", "MonDernierArticle":"Pâtes"]

//Pour afficher un élément du tableau dans ce cas j'utilise ce que j'ai mis avant les deux points
//par exemple:
println( courses["MonAutreArticle"] )
println( courses["MonAutreArticle"] as String )

Optional(Nutella)
Nutella

LES STRING (CHAINE DE CARACTÈRES)

Pour connaitre la longeur d’un texte ou d’une phrase, il faut utiliser  » count() « .

println( count(phrase) )
print("et")

//Il ne faut pas oublier que dans tout mon tutoriel, je privilégie l'ajout de variable mais une variable est en partie un bout de code détaché que l'on peu utiliser plusieurs fois ou modifier. Je peux donc écrire ma phrase directement à la place de ma variable.
println( count("J'ai soif") )

9
et
9

Si vous n’avez pas très bien compris, la vidéo est pour vous. Dans le cas contraire, vous n’avez pas besoin de regarder la vidéo.

Exercices sur les bases

Pour rappel, tous les exercices doivent être envoyés à cours@ajevolution.com avec un unique fichier .zip ou .playground (pas de .swift) et doivent obligatoirement contenir le titre de l’exercice comme sujet. De cette manière, vous recevrez la correction de l’exercice concerné en moins d’une heure et cela vous évitera de tricher.
Tout message ne respectant pas la convention est automatiquement supprimé et ne pourra jamais être lu. Merci de votre compréhension.

1SWIFT – Premier exercice

Pour ce premier exercice, affichez dans un print() « Salut Toto » en utilisant que les variables ci-dessous puis changez la valeur de « Toto » par « mon chat ».

let variable3 = "Salut" 
var variable4 = "Toto"

/*
Ajoutez votre code ici.
*/

Ce qui devra afficher:
Salut Toto
Salut mon chat

Maintenant, j’aimerais connaitre la manière de dire à Swift de me donner la somme de toutes les valeurs de mon tableau puis la soustraction de ces mêmes valeurs.

let monTableau = [43, 54, 4534, 65]

/*
Ajoutez votre code ici.
*/

Ce qui devra afficher :
L'addition de toutes les valeurs de mon tableau est égal à 4696
La soustraction de toutes les valeurs de mon tableau est égal à -4610

Comment envoyer ma correction pour cet exercice ?

2SWIFT – Deuxième exercice

Exercie 2SWIFT annulé, veuillez passer à la leçon suivante.

Les bases ++

Avant de commencer, il est parfois obligatoire de ne pas mettre un caractère en dur. On utilise donc son numéro hexadécimal grâce au  » u{} « . Je vous invite à essayer plusieurs caractères en recherchant des convertisseurs.
Ceci n’est valable que pour un caractère par caractère.

let dollar = "u{24}"
let coeurNoir = "u{2665}"
let coeurEmo = "u{1F496}"

println(dollar)
println(coeurNoir)
println(coeurEmo)

$

💖

Vous pouvez convertir une chaîne de caractères qui contient uniquement des chiffres en un chiffre normal. Cela n’a pas l’air très intéressant mais quand vous ferez votre application ou mes exercices, cela peut être utile.

let possibleNumber = "153"
let convertedNumber:Int? = possibleNumber.toInt()
println(convertedNumber)

Optional(153)

Un autre type de variable, peu utile, mais pratique pour les conditions, les booléens qui revient à dire 0 ou 1: Faux ou Vrai (false or true).

let cookiesCestBon = true //ou false

//if: si; else: sinon;
//Donc: Si cookiesCestBon==true ..sinon..
if cookiesCestBon {
    println("Tu aimes les cookies :)")
} else {
    println("Tu n'aimes pas les cookies")
}

Tu aimes les cookies 🙂

CONDITIONS

Ci-dessus, nous avons vu une condition avec IF mais les règles de conditions sont valables partout.
Vous pouvez mettre plusieurs conditions avec des ET  » &&  » ou des OU  » ||  » (Shift+Alt+L).
Aussi, les conditions n’utilisent que les règles suivantes, il en existe pas d’autre:

 » ==  » : égal à,
 » ===  » : égal et exactement du même type que,
 » !=  » : n’est pas égal à,
 » <=  » : inférieur ou égal à,
 » >=  » : supérieur ou égal à,
 » <  » : inférieur à,
 » >  » : supérieur à.

Voici un exemple avec un IF :

let variable7 = 1
let variable8 = true
var variable9 = 5.4

if variable7==5 && variable9==3.6 || variable8 {
    println("Ca respecte ma condition.")
} else {
    println("Mes conditions ne sont pas respectées.")
}

Ca respecte ma condition.

A savoir que si vous souhaitez isoler des conditions, vous pouvez le faire comme en mathématique ! avec les parenthèses.

BOUCLE: FOR IN

Comme son nom l’indique:  » Pour … dans …, je fais … « . On initie directement dans la boucle une variable qui sera uniquement compatible avec la boucle et lira un par un notre chaîne et prendra sa valeur.

//ce peut être une chaîne de caractères
for i in "3456" {
    println(i)
}	

//un tableau				
for i in [3,4,5,6] {
    println(i)
}

//ou bien une chaîne allant d'un nombre à un autre
for i in 3...6 {
    println(i)
}

//Ses 3 boucles font exactement la même chose

3
4
5
6

Etant donné que le i de l’exemple prends la valeur qu’on lui donne un par un, une phrase peut très bien fonctionner.

for variableTest in "Salut ça va ?" {
    println(variableTest)
}

S
a
l
u
t

ç
a

v
a

?

BOUCLE: FOR

Généralement utile si l’on a un tableau.

var courses = ["pain de mie", "Confiture de fraises", "Nutella", "Haricots vert", "Pâtes"]

for (i, e) in enumerate(courses) {
    println("Article (i): (e)")
}

Article 0: pain de mie
Article 1: Confiture de fraises
Article 2: Nutella
Article 3: Haricots vert
Article 4: Pâtes

Aussi, nous pouvons utiliser le style:

for /*initialisation*/; /*condition*/; /*ce que fait ma variable à chaque tour*/ {
    /*code habituel*/
}

Ne pas oublier que nous créons une variable valable que dans la même boucle. On peut donc utiliser le même nom pour toute nos boucles.

//je met i à 0, je vais faire des tours dans ma boucle tant que i sera inférieur à 6.
//J'ajoute +1 à i à chaque tour.
for var i = 0; i<6; i++ {
    println(i)
}

0
1
2
3
4
5

BOUCLE: WHILE

Tant que … je fais … sans m’arrêter !

while convertedNumber != 6 {
    println("Tant que mon nombre n'est pas égal à 6 je m'exécute sans m'arrêter. Je bloque donc l'exécution des codes ci dessous.")
}

println("Hello ?")

Tant que mon nombre n'est pas égal à 6 je m'exécute sans m'arrêter. Je bloque donc l'exécution des codes ci dessous.
Tant que mon nombre n'est pas égal à 6 je m'exécute sans m'arrêter. Je bloque donc l'exécution des codes ci dessous.
Tant que mon nombre n'est pas égal à 6 je m'exécute sans m'arrêter. Je bloque donc l'exécution des codes ci dessous.
...
Tant que mon nombre n'est pas égal à 6 je m'exécute sans m'arrêter. Je bloque donc l'exécution des codes ci dessous.

Si nous souhaitons faire comme la boucle For, il faut cette fois initier ou utiliser une variable déjà utilisée.

//si nous souhaitons faire comme le For
var test = 0
while test<6 {
    println(test)
    test++
}

0
1
2
3
4
5

Apprenez-en beaucoup plus grâce à mon cours vidéo.

Exercices qui déterminent votre logique informatique

Pour rappel, tous les exercices doivent être envoyés à cours@ajevolution.com avec un unique fichier .zip ou .playground (pas de .swift) et doivent obligatoirement contenir le titre de l’exercice comme sujet. De cette manière, vous recevrez la correction de l’exercice concerné en moins d’une heure et cela vous évitera de tricher.
Tout message ne respectant pas la convention est automatiquement supprimé et ne pourra jamais être lu. Merci de votre compréhension.

3SWIFT – Troisième exercice

Veuillez créer une fonction qui remplace tous les « s » d’une phrase par un « u ».
Je vous donne pour ce premier exercice un indice.
Ne pas utiliser de librairie externe s’il vout plaît.

func transformerSenU( phrase:String ) ->String {
    var phrase2:String = ""
    
    /*
    Ajoutez votre code ici.
    */
    
    return phrase2
}

print( transformerSenU("Je n'ai plus de S car tous mes s ont été remplacés :S") )

Ce qui devra afficher:
Je n'ai pluu de u car tout meu u ont été remplacéu :u

Créer maintenant une boucle parcourant le tableau ci-dessous et afficher son contenu.

let monTableau = ["H", "e", "y", ",", " ", "j", "e", " ne t", "'", "ai pas vu ", "hier soir"]

/*
Ajoutez votre code ici.
*/

Ce qui devra afficher :
Hey, je ne t'ai pas vu hier soir

Comment envoyer ma correction pour cet exercice ?

4SWIFT – Quatrième exercice

Créer une fonction calculant la table de multiplication d’un nombre quelconque. Puis utiliser la même fonction dans une boucle afin d’afficher la table de multiplication des nombres allant de 1 à 10.

func tableMultiplier(nombre:Int) {
    /*
    Ajoutez votre code ici.
    */
    
}

/*
Ajoutez le reste de votre code ici.
*/

Comment envoyer ma correction pour cet exercice ?

5SWIFT – Cinquième exercice

À l’aide d’une boucle, afficher une pyramide d’étoile afin d’obtenir ce même résultat.
À savoir qu’il faut utiliser des espaces et des retours à la lignes.


         *
        ***
       *****
      *******
     *********
    ***********
   *************
  ***************

Comment envoyer ma correction pour cet exercice ?

Bases de Xcode 6 (ou 5)

Créer le projet

Commençons droit au but, créons un nouveau projet Xcode (« Create a new Xcode project »). Vous pouvez le faire en ré-ouvrant Xcode ou simplement avec le raccourci Shift+cmd+N.

racourcisNouveauProjectXcode6
Ensuite vous avez le choix entre plusieurs Template, intuitivement vous vous dites que c’est mieux de prendre un Template déjà fait pour mieux comprendre, malheureusement si vous débutez vous n’y comprendrez rien ! Alors le conseil est de me suivre et de choisir « Single View Application ».

TemplateSingleViewNewProjectXcode6

Ensuite les configurations ne devront jamais changer quelque soit l’application que vous faites. Si vous n’êtes pas faché avec l’anglais vous comprendrez qu’il faut mettre dans l’ordre:
– Le nom de votre application (privillégiez un nom court, vous verrez pourquoi),
– Le nom de votre entreprise (si vous n’en avez pas, votre Nom et Prénom suffisent),
– L’identifiant de votre entreprise (il faut avoir un compte dévelopeur à 93€/an pour en avoir donc mettez-y un « 1 » ou ce que vous voulez),
– Le langage utilisé pour programmer (réfléchissez, prenez le Swift !),
– Les appareils concernés (maintenant, on ne fait que des applications universelles. Vous verrez que l’on peut changer pas mal de choses en fonction de l’écran utilisé sans avoir 36000 applications) ,
– Utiliser le Core data*(1) : Non.

*(1)Le Core Data de Apple est une solution rapide pour stocker des données. Elle est cependant très dificile à manipuler entièrement. La plupart du temps, nous avons uniquement besoin de stocker le résultat d’une variable quelconque comme par exemple les identifiants permettant de se connecter à votre application. Ses données doivent être sauvegardées même quand l’utilisateur quitte votre application et j’utilise un moyen beaucoup plus parlant que le Core Data de Apple que je vous montrerais dans la partie « Application de login ».

Comprendre l’interface Xcode 6

Après avoir choisi le dossier où sauvegarder votre projet, vous avez une application totalement opérationelle, vous pouvez essayer ! Elle n’affiche rien mais elle fonctionne. Quant à moi, je ne vais pas jouer au bidouilleur avec vous aujourd’hui, je commence par vous expliquer tout ce que vous voyez sur votre écran.

Je vous invite à lire la vidéo ci-dessous, vous en aurez besoin pour créer votre propre application quand je ne serais pas là pour vous aider. Elle explique les fonctionnements de base du logiciel tout en évitant les pertes de temps sur les choses facile à prendre en main.

L’identité de l’application:

– « Version » : La version de votre application. C’est à vous de définir la version de votre application, exactement comme un vrai développeur, votre application ne cesse d’évoluer et si vous la mettez dans l’apple store puis que vous ajoutez une nouvelle fonctionalité, changer le numéro de version est obligatoire. 1.1 pour des modifications mineures par exemple et 2, 3, 4(…) pour les modifications majeures.
– « Build » : Numéro de build
– « Team » : Si vous avez payé pour le programme « Développeur iOS » ou votre entreprise, il faut vous connecter à ce compte développeur. Si vous n’avez rien payé, laissez toujours ce champ vide.

Informations sur la compatibilitée de l’application :

– « Deployment target » : Choix de la version d’iOS à partir de laquelle elle peut être compatible. Je conseillerais de rendre disponible votre application à partir de iOS7.
– « Main interface » : Fichier Storyboard par défaut à l’ouverture de l’application sur iOS.
– « Device orientation » : Vous l’aurez compris, il s’agit de bloquer ou pas l’accès à certaines orientations de l’iPhone ou de l’iPad.

Icône de l’application et interface de chargement :

– « App icons source » : Fichier pour les Icônes de l’application selon la résolution de l’écran du smartphone. Ce fichier se trouve dans Images.xcassets*(2)

*(2)Le fichier Images.xcassets est en fait un dossier spécialement conçu pour des fichiers d’Icônes. Vous pouvez créer ou importer autant d’Icônes que nécessaire et créer si vous le souhaitez des Icônes hautes définitions pour les iPad.

– « Launch Screen File » : Fichier Storyboard du chargement de l’application. Une Icône de l’application ou simple texte suffit.

Target membership :

Avant de mettre l’application dans l’iPhone, Xcode compile vos code afin qu’ils soient compris par iOS.
C’est à vous de choisir quel fichier compiler et dans quel « Target » le compiler ! De base vous avez un « Target » au nom de votre application. Si vous ne souhaitez pas compiler un certain fichier à des fins de test, vous pouvez décocher la case.

Vous pouvez voir qu’il y a un autre « Target test ». Si vous mettez un fichier dans un target test, vous pouvez le compiler en changeant de target ici :

 

Modifier d’autres informations

Nous avons jusqu’ici modifié les réglages généraux de notre application mais vous pouvez apercevoir 5 autres onglets. C’est lorsque vous devez ajouter des frameworks*(3), ajouter des fonctionalitées GameCenter, choisir quels fichiers compiler depuis une liste…etc que vous aurez besoin de « toucher » à ces onglets. Autant vous dire que vous vous en servirez jamais sauf si vous créez une application professionnelle. Dans ce cas, cela voudrait dire que vous avez fait des recherches pour améliorer votre application et que vous n’êtes plus en phase débutant et donc que cette partie du tutoriel ne vous apportera rien. Ceci dit, certains réglages sont à changer sans être professionel.

Changer la langue par défaut de notre application. (Vous pourrez par la suite ajouter des traductions, mais nous le verrons dans la vidéo)

Voir les fichiers compilés. De base, tous vos fichiers sont compilés mais si vous avez des erreurs de compilation, véfifiez si tout y est.

*(3)Un framework rassemble plusieurs bibliothèques. Pour faire simple, c’est un ensemble de classes déjà faites par d’autres développeurs, tel que vous, qu’il vous suffit d’appeler dans votre code habituel. En ajoutant un framework à votre application, vous aurez donc plein de nouvelles fonctions, même d’autre manière de procéder. Il faudra donc lire la documentation du Framework afin de l’utiliser.

 

Interface et Auto layout: Le storyboard

Je vous invite à découvrir cette partie du tutoriel dans ma vidéo.

 

Cours vidéo

Première interaction Code/Graphique

Le code pour la récupération d’un fichier JSON à changé depuis SWIFT 2.0, les modifications à faire sont les suivantes:
– Changer le code pour la partie JSON
– Modifier le Information.plist

//JSON
do {
            let url = NSURL(string: "http://tuto.a-j-evolution.com/exemples/test1.json")
            let jsonData = NSData(contentsOfURL: url!)
            let jsonResult = try NSJSONSerialization.JSONObjectWithData(jsonData!, options: NSJSONReadingOptions(rawValue: 0)) as? NSDictionary
            if let jsonResult = jsonResult {
                
                let jsonDate: String! = jsonResult["date"] as! NSString as String
                let jsonHeure: String! = jsonResult["heure"] as! NSString as String
                self.monLabel.text = jsonDate+", "+jsonHeure
                self.monChamp.text = jsonResult["nom"] as! NSString as String
                self.monChamp2.text = jsonResult["mail"] as! NSString as String
                self.monChamp3.text = jsonResult["mdp"] as! NSString as String
                
            } else {
                //gestion des erreurs
            }
} catch let error as NSError {
            //gestion des erreurs
}
//Fin JSON

Pour changer le fichier .plist, vous pouvez suivre la fin de cette video:

https://youtu.be/crJ-DxsV2Aw?t=10m15s

infoPlistHTTPS
infoPlistHTTPS2

Une_appliction_iOS9.zip - 163 téléchargements depuis samedi 5 décembre 2015. (pour Xcode7 et ultérieur)

Application de login – Json – PHP – MySQL

Connaitre le PHP serait un plus mais puisque j’explique le fonctionnement, vous n’aurez pas de problème à suivre ce tutoriel.

Se documenter

Definition: Fichier JSON
Definition: Base de données
Definition: PHP
Liste des codes HTTP

Cours vidéo

Coder la fonction de connexion

Pour tester la connexion à la base de données via le serveur :
https://www.a-j-evolution.com/tutos/exemples/ioslogin/
Ce fichier contient le code source suivant:

index.html

<form method="POST" action="https://www.a-j-evolution.com/tutos/exemples/ioslogin/login.php">
    <input type="text" id="pseudo" name="pseudo">
    <input type="text" id="mdp" name="mdp">
    <input type="submit" value="Se connecter">
</form>

Pour tester que votre application fonctionne, mettez ce lien dans la variable URL de votre application Swift :
https://www.a-j-evolution.com/tutos/exemples/ioslogin/login.php

Ce fichier contient le code source suivant:

login.php

<?php
header("Content-type: application/json");


function connecter()
{
    $connect=@mysql_connect("localhost", "nom utilisateur", "mot de passe");
    if(!$connect)
    {
    echo "Erreur de connexion a la base de donnees";
    exit;
    }
    $select=@mysql_select_db('nom de la base de donnees');   
    if(!$select)
    {
    echo "Erreur de connexion a la base de donnees";
    exit;
    }
}
connecter();

$pseudo=$_POST['pseudo'];
$pseudo= strtolower($pseudo);
$mdp=$_POST['mdp'];

$query="SELECT id,nom FROM `membres_ioslogin` WHERE `pseudo` LIKE '$pseudo' AND `mdp` LIKE '$mdp'";
 $result=mysql_query($query);
 $num=mysql_num_rows($result);
 $row=mysql_fetch_row($result);
 $id=$row[0];
 $nom=$row[1];

if($num !=1){
    $erreur=0;
}else{
    $erreur=1;
}

echo '{  "erreur":'.$erreur.', "nom":"'.$nom.'", "id":"'.$id.'", "pseudo":"'.$pseudo.'"  }';

L’action à ajouter au bouton de votre application iOS est la suivante :

code en swift

@IBAction func seConnecter(sender: UIButton) {
        //On récupère les valeur que l'utilisateur a entré
        var username:NSString = monchamp.text
        var password:NSString = monchamp2.text
        
        if( username.isEqualToString("") || password.isEqualToString("") ){
            //si les champs sont vides, on affiche une Alerte :
            var alert:UIAlertView = UIAlertView()
            alert.title = "Erreur"
            alert.message = "Entrez vos identifiants"
            alert.delegate = self
            alert.addButtonWithTitle("OK")
            //un autre bouton de meme valeur pour le fun
            alert.addButtonWithTitle("Pourquoi pas, d'accord")
            alert.show()
        }else{
            //si les champs sont remplis, on lance la requete POST et tout ce qui va avec

            /*
            Les requêtes que l'on envoie en POST: Pseudo et Password
            Si l'on veut envoyer une requête POST permettant d'ajouter un membre à la base de données, vous pouvez changer le fichier de destination et ajouter les variables "mail=" ..etc
            */
            var post:NSString = "pseudo=(username)&mdp=(password)"
            
            NSLog("PostData: %@",post);
            
            var url:NSURL = NSURL(string:"https://www.a-j-evolution.com/tutos/exemples/ioslogin/login.php")!
            
            var postData:NSData = post.dataUsingEncoding(NSASCIIStringEncoding)!
            var postLength:NSString = String( postData.length )
      
            var request:NSMutableURLRequest = NSMutableURLRequest(URL: url)
            request.HTTPMethod = "POST"
            request.HTTPBody = postData
            request.setValue(postLength as String, forHTTPHeaderField: "Content-Length")
            request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
            request.setValue("application/json", forHTTPHeaderField: "Accept")
            
            
            var reponseError: NSError?
            var response: NSURLResponse?
            
            var urlData: NSData? = NSURLConnection.sendSynchronousRequest(request, returningResponse:&response, error:&reponseError)
            
            if ( urlData != nil ) {
                let res = response as! NSHTTPURLResponse!;
                
                NSLog("Response code: %ld", res.statusCode);
                
                if (res.statusCode >= 200 && res.statusCode < 300)
                {
                    var responseData:NSString  = NSString(data:urlData!, encoding:NSUTF8StringEncoding)!
                    
                    NSLog("Response ==> %@", responseData);
                    
                    var error: NSError?
                    
                    let jsonData:NSDictionary = NSJSONSerialization.JSONObjectWithData(urlData!, options:NSJSONReadingOptions.MutableContainers , error: &error) as! NSDictionary
                    
                    //On récupère la valeur de "erreur" sur le fichier PHP. Cette variable success est utile pour vérifier l'erreur côté serveur, si les identifiants sont entrés corectement  
                    let success:NSInteger = jsonData.valueForKey("erreur") as! NSInteger
                    
                    
                    NSLog("Success: %ld", success);
                    
                    if(success == 1)
                    {
                        NSLog("Login OK");
                        
                        //On incrémente les données du fichier PHP dans des variables
                        var idJSON:NSString = jsonData.valueForKey("id") as! NSString
                        var nomJSON:NSString = jsonData.valueForKey("nom") as! NSString
                        var pseudoJSON:NSString = jsonData.valueForKey("pseudo") as! NSString
                        
                        //Puis on "transforme" ses variables en variables qui resteront stockées dans l'iPhone ou l'iPad.
                        maVariableIneffacable.setObject(idJSON, forKey: "ID")
                        maVariableIneffacable.setObject(nomJSON, forKey: "NOM")
                        maVariableIneffacable.setObject(pseudoJSON, forKey: "PSEUDO")
                        maVariableIneffacable.setInteger(1, forKey: "estCO")
                        maVariableIneffacable.synchronize()
                        
                        //On change de vue grace à l'identifiant "r" que l'on a définis dans notre Storyboard
                        self.performSegueWithIdentifier("r", sender: self)
                        
                    }else{
                        NSLog("Login échoué");
                        
                        var alertView:UIAlertView = UIAlertView()
                        alertView.title = "Invalide"
                        alertView.message = "Vos identifiants ne correspondent pas"
                        alertView.delegate = self
                        alertView.addButtonWithTitle("OK")
                        alertView.show()
                        
                    }
                    
                } else {
                    var alertView:UIAlertView = UIAlertView()
                    alertView.title = "Erreur"
                    alertView.message = "Veuillez vous connecter à internet"
                    alertView.delegate = self
                    alertView.addButtonWithTitle("OK")
                    alertView.show()
                }
            } else {
                var alertView:UIAlertView = UIAlertView()
                alertView.title = "Erreur"
                alertView.message = "Veuillez vous connecter à internet"
                if let error = reponseError {
                    alertView.message = (error.localizedDescription)
                }
                alertView.delegate = self
                alertView.addButtonWithTitle("OK")
                alertView.show()
            }
            
        }//fin du SI champs vides
}

Votre UIAlertButton peut avoir plusieurs actions, si vous voulez le faire il faut remplacer « alertView.addButton.. » par « alert.addAction() ».
Cette action sera une fonction que vous créez vous-même. Voici un exemple simple:

code en swift

var alertView:UIAlertView = UIAlertView()
alertView.title = "Erreur"
alertView.message = "Veuillez vous connecter à internet"
alertView.delegate = self

var ok = UIAlertAction(title: "OKI", style: UIAlertActionStyle.Default) {
    UIAlertAction in
    //L'action que l'alerte fera lorsque vous cliquez sur OKI
    //...
}
var annuler = UIAlertAction(title: "Annuler", style: UIAlertActionStyle.Cancel) {
    UIAlertAction in
    //L'action que l'alerte fera lorsque vous cliquez sur Annuler
    //...
}
var autre = UIAlertAction(title: "Test", style: UIAlertActionStyle.Default) {
    UIAlertAction in
    //...
}

alertController.addAction(ok)
alertController.addAction(annuler)
alertController.addAction(autre)

alertView.show()

Login_JSON_Swift.zip - 704 téléchargements depuis jeudi 28 mai 2015. (pour Xcode6)

Login_JSON_Swift2.zip - 915 téléchargements depuis mercredi 14 octobre 2015. (pour Xcode7 et ultérieur)

Core animation !

Créer un petit jeu d’animation avec des animations que vous créez vous même.

Cours vidéo

Intégrer l’animation

Pour faire intéragir nos animations avec des boutons ou des gestures, il suffit de créer une variable correspondant à notre scène puis d’utiliser cette variable pour lancer les diferentes animations.

code en swift

//Variable de la scnène crée
@IBOutlet weak var nuage: NuagesView!
//Lancement de l'animation
nuage.addNuagesAnimation()

C’est aussi simple que ça ! A vous de créer des boutons ou des gestures appelant une scène comme par exemple ce bouton :

code en swift

@IBAction func droite_gesture(sender: AnyObject) {
    avion.addTournerAdroiteAnimation()
    
    //apres 1,5 seconde
    let delay = 1.5 * Double(NSEC_PER_SEC)
    var time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
    dispatch_after(time, dispatch_get_main_queue(), {
    self.avion.addVolAnimation();
    })
}

Test_Avion_Swift.zip - 179 téléchargements depuis dimanche 21 juin 2015. (pour Xcode6)

AvionAJE_swift2.zip - 221 téléchargements depuis samedi 4 juillet 2015. (pour Xcode7 et ultérieur)

Créer un code propre compatible pour tout les écrans

Le fichier téléchargeable ci-dessus comporte volontairement des erreurs d’affichage pour les écrans autre que l’iPhone6 Plus. Veuillez recréer une application compatible avec tout les ecrans en ne travailant que dans le « For all layout »

Astuce: Mettre la vue comportant les nuages en mode « Redraw »

avionAJE_nuageModeRedraw

Comment envoyer ma correction pour cet exercice ?

UITableView très complet

Grace à ce tutoriel, les UITableView n’auront plus de secrets pour vous !

Cours vidéo

Partie 1 :

Partie 2 :

Rendre la compatibilité Swift 2.0

Faire en sorte que les cellules ne soient pas de la même hauteur

UITableView_Customisable.zip - 302 téléchargements depuis lundi 17 août 2015.

TableViewCustom_JSON_SearchBar.zip - 245 téléchargements depuis jeudi 20 août 2015.

TableViewCustom_JSON_SearchBar-SWIFT2_0.zip - 311 téléchargements depuis jeudi 12 novembre 2015.

TableView Custom_JSON_SearchBar-SWIFT3.0.zip - 122 téléchargements depuis dim. 26 février 2017.

Notifications locales

Introduction design pour votre application

Intro_design-UIPageView_Swift2.zip - 168 téléchargements depuis jeudi 8 février 2016.

Introduction au JSON et dialogue avec serveur web (Swift 3)

import Fondation

/*var dictionaire: NSDictionary = [
"nom":"Gel douche",
"prix":5.82,
"categories":["gel", "bain", "douche", "salle de bain"]
]

let categories = dictionaire["categories"]! as! NSArray
print(categories[2])*/

do {
let url = NSURL(string: "http://tuto.a-j-evolution.com/exemples/json/2.json");
let texte:NSString = try NSString(contentsOf: url! as URL, usedEncoding: nil)
print(texte)

let jsonData = texte.data(using: 4)
let jsonResult: NSDictionary? = try JSONSerialization.jsonObject(with: jsonData!) as? NSDictionary

if let jsonResult = jsonResult {
print("JsonResult est bien convertit")
let categories = jsonResult["categories"]! as! NSArray
print(categories[2])
}
} catch {
print("Erreur de conversion")
}

do {
let url = NSURL(string: "http://tuto.a-j-evolution.com/exemples/json/1.json");
let texte:NSString = try NSString(contentsOf: url! as URL, usedEncoding: nil)

let jsonData = texte.data(using: 4)
let jsonResult: NSArray? = try JSONSerialization.jsonObject(with: jsonData!) as? NSArray

if let jsonResult = jsonResult {
print("JsonResult est bien convertit")
for dico in jsonResult {
let dico2 = dico as! NSDictionary
print(dico2["prix"]!)
}
}
} catch {
print("Erreur de conversion")
}