{"id":1065,"date":"2014-07-09T10:23:45","date_gmt":"2014-07-09T14:23:45","guid":{"rendered":"http:\/\/tim.cstj.qc.ca\/cours\/xcode\/wp\/?page_id=1065"},"modified":"2014-07-09T10:23:45","modified_gmt":"2014-07-09T14:23:45","slug":"swift-introduction","status":"publish","type":"page","link":"https:\/\/ve2cuy.com\/xcode\/swift-introduction\/","title":{"rendered":"Swift &#8211; Introduction"},"content":{"rendered":"<p><span style=\"color: #ff0000;\">Note\u00a0&#8211; Article en cours de r\u00e9vision &#8211; version du 2015.09.30<\/span><\/p>\n<h3><strong>Contenu<\/strong><\/h3>\n<ol>\n<li><a href=\"#a1\">Le langage de programmation Swift<\/a><\/li>\n<li><a href=\"#a2\">Le &lsquo;playground&rsquo;<\/a><\/li>\n<li><a href=\"#a3\">Concepts et syntaxe<\/a><\/li>\n<li><a href=\"#a4\">Les variables et constantes<\/a><\/li>\n<li><a href=\"#a5\">Traitements sur les cha\u00eenes de caract\u00e8res<\/a><\/li>\n<li><a href=\"#a6\">Interpolation de cha\u00eenes<\/a><\/li>\n<li><a href=\"#a7\">Conversion de types<\/a><\/li>\n<li><a href=\"#a8\">Les tableaux<\/a><\/li>\n<li><a href=\"#a9\">Les dictionnaires<\/a><\/li>\n<li><a href=\"#a10\">Les boucles<\/a><\/li>\n<li><a href=\"#a11\">Les tests (if, switch)<\/a><\/li>\n<li><a href=\"#a12\">Les fonctions<\/a><\/li>\n<li><a href=\"#a13\">Les structures de donn\u00e9es<\/a><\/li>\n<li><a href=\"#a14\">Les classes<\/a><\/li>\n<li>\u00c9num\u00e9rations &#8211; enum<\/li>\n<li>Observation de valeurs vs temps<\/li>\n<li>Protocoles &#8211; voir le projet <a href=\"\/xcode\/index.php\/projet-aquarium-poo-et-protocols\/\">Aquarium<\/a><\/li>\n<\/ol>\n<hr \/>\n<p><a name=\"a1\"><\/a><\/p>\n<h1>Le langage de programmation\u00a0Swift<\/h1>\n<p><a href=\"\/xcode\/wp-content\/uploads\/2014\/07\/Apple_Swift_Logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft wp-image-1088 size-full\" src=\"\/xcode\/wp-content\/uploads\/2014\/07\/Apple_Swift_Logo.png\" alt=\"Apple_Swift_Logo\" width=\"256\" height=\"256\" \/><\/a><br \/>\nPr\u00e9sent\u00e9 \u00e0 la conf\u00e9rence de la WWDC du printemps 2014, \u00a0Swift est un langage de programmation d\u00e9velopp\u00e9 par la soci\u00e9t\u00e9 Apple. \u00a0Il est destin\u00e9 \u00e0 la programmation d&rsquo;applications sur les syst\u00e8mes d&rsquo;exploitation iOS (iPhone, iPad) et OS X (MAC).<br \/>\nSwift peut coexister avec l&rsquo;Objective-C, langage actuel de programmation pour les syst\u00e8mes d&rsquo;exploitation d&rsquo;Apple. \u00a0Selon la firme de Cupertino\u00a0, ce nouveau langage est rapide, moderne, s\u00e9curis\u00e9 et interactif. \u00a0Il contribuera probablement \u00e0 att\u00e9nuer la courbe d&rsquo;apprentissage du d\u00e9veloppement d&rsquo;application pour iOS entre autre gr\u00e2ce au module \u00ab\u00a0playGround\u00a0\u00bb<br \/>\n&nbsp;<br \/>\n&nbsp;<\/p>\n<hr \/>\n<p><a name=\"a2\"><\/a><\/p>\n<h1>Un langage interactif &#8211; PlayGround<\/h1>\n<p>Mise \u00e0 part la simplicit\u00e9 de la syntaxe du langage, une des nouveaut\u00e9s contribuant \u00e0 l&rsquo;apprentissage du langage est le module &lsquo;PlayGround&rsquo;.<br \/>\nPlayGround est un environnement o\u00f9 il est possible d&rsquo;\u00e9crire des instructions Swift et d&rsquo;obtenir des r\u00e9sultats en temps r\u00e9el.<br \/>\nUne des fa\u00e7ons d&rsquo;obtenir ce &lsquo;terrain de jeu&rsquo; est de cr\u00e9er un nouveau projet Xcode et de choisir l&rsquo;option &lsquo;<strong>Get started with a playground<\/strong>&lsquo;:<br \/>\n<strong><span style=\"color: #ff0000;\">Action<\/span> <\/strong>&#8211; D\u00e9marrons Xcode et s\u00e9lectionnions &lsquo;Get started with a playground&rsquo;:<br \/>\n&nbsp;<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1098\" src=\"\/xcode\/wp-content\/uploads\/2014\/07\/new.xcode_.projet.png\" alt=\"new.xcode.projet\" width=\"496\" height=\"467\" \/><br \/>\n&nbsp;<br \/>\nNommons \u00a0le projet:<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1097\" src=\"\/xcode\/wp-content\/uploads\/2014\/07\/new.playground.projet.nommer.png\" alt=\"new.playground.projet.nommer\" width=\"423\" height=\"166\" \/><br \/>\nVoici le terrain de jeux:<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1096\" src=\"\/xcode\/wp-content\/uploads\/2014\/07\/Intro_au_terrain_de_jeux_playground.png\" alt=\"Intro_au_terrain_de_jeux_playground\" width=\"942\" height=\"517\" \/><br \/>\nR\u00e9f\u00e9rence <a href=\"https:\/\/developer.apple.com\/library\/prerelease\/ios\/recipes\/xcode_help-source_editor\/ExploringandEvaluatingSwiftCodeinaPlayground\/ExploringandEvaluatingSwiftCodeinaPlayground.html\">Apple<\/a><\/p>\n<hr \/>\n<p><a name=\"a3\"><\/a><\/p>\n<h1>Concepts et syntaxe de Swift<\/h1>\n<p><strong>Note<\/strong>: <em>Ceci n&rsquo;est pas un document d&rsquo;introduction \u00e0 la programmation. \u00a0Nous prenons pour acquis que vous ma\u00eetrisez des\u00a0concepts tel que: variables, boucles, tests, fonctions, objet, m\u00e9thodes, propri\u00e9t\u00e9s, &#8230;<\/em><br \/>\n<a name=\"a4\"><\/a><\/p>\n<h1>Les variables<\/h1>\n<h2>Types de base<\/h2>\n<p>[table]<br \/>\nType, Exemple<br \/>\n<strong><em><span style=\"color: #c32275;\">Int &#8211; UInt &#8211; UInt32,<\/span><\/em><\/strong>\u00a0 0 ; 1 ; 55 ; 32767 ; -2<br \/>\n<strong><em><span style=\"color: #c32275;\">Float &#8211; CGFloat &#8211;<\/span><\/em><\/strong>\u00a0<span style=\"color: #c32275;\"><em><strong><span style=\"color: #c32275;\">Double,<\/span><\/strong><\/em><\/span>\u00a02.345; 3.141592 ; -105678.999<br \/>\n<em><strong><span style=\"color: #c32275;\">Bool,<\/span><\/strong><\/em>\u00a0true ; false<br \/>\n<em><strong><span style=\"color: #c32275;\">String<\/span><\/strong><\/em>\u00a0, &lsquo;Paul&rsquo; ; \u00ab\u00a0CSTJ.qc.ca\u00a0\u00bb<br \/>\n<strong><em><span style=\"color: #c32275;\">ClassName,<\/span><\/em><\/strong>\u00a0UIButton ; UIColor ; UIImage ; Personnage ; \u2026<br \/>\n[\/table]<br \/>\n<strong><br \/>\nSyntaxe:<\/strong><\/p>\n<blockquote><p><span style=\"color: #c32275;\">var<\/span>\u00a0nom:<span style=\"color: #703daa;\">Type<\/span>\u00a0= <span style=\"color: #c91b13;\">valeur<\/span><\/p><\/blockquote>\n<p><strong><br \/>\nExemples<\/strong> :<\/p>\n<pre class=\"toolbar:1 lang:swift decode:true \">var unEntier:Int = 99\nvar unReel:Float = 3.1415\nvar unDouble:Double = 3.1415920123456789087654321\nvar unBooleen:Bool = true\nvar uneChaine:String = \"CSTJ.TIM\"\nvar uneVue:UIView = UIView(frame : CGRectMake(0,0,50,50))<\/pre>\n<p>&nbsp;<\/p>\n<h2>D\u00e9claration inf\u00e9r\u00e9e (le type sera d\u00e9duit par Xcode)<\/h2>\n<pre class=\"toolbar:1 lang:swift decode:true\">var unEntier = 99\nvar unReel = 3.1415\nvar unDouble = 3.1415920123456789087654321\nvar unBooleen = true\nvar uneChaine = \"CSTJ.TIM\"\nvar uneVue = UIView(frame : CGRectMake(0,0,50,50))<\/pre>\n<p>&nbsp;<\/p>\n<h2>Variables versus Constantes<\/h2>\n<pre class=\"toolbar:1 lang:swift decode:true\">var uneVariableMutable = 2.2    \/\/ anglais : mutable\nuneVariableMutable = 1.4241\nlet uneVariableImmutable = 9.9  \/\/ anglais : immutable\nuneVariableImmutable = 123      \/\/ erreur de compilation<\/pre>\n<p>Note: \u00a0Apple recommande l&rsquo;utilisation de contantes \u00e0 la place de variables lorsque possible.<\/p>\n<h2>Variables avec valeur non optionnelle<\/h2>\n<pre class=\"toolbar:1 lang:swift decode:true\">var uneChaineAvecValeurNonOptionnelle :String\nprintln(uneChaineAvecValeurNonOptionnelle) \/\/ produira une erreur \u00e0 l\u2019ex\u00e9cution\nuneChaineAvecValeurNonOptionnelle = nil \/\/ produira une erreur \u00e0 l\u2019ex\u00e9cution<\/pre>\n<p>&nbsp;<\/p>\n<h2>Variables avec valeur optionnelle<\/h2>\n<pre class=\"toolbar:1 lang:swift decode:true\">var uneChaineAvecValeurOptionnelle:String?\nIf let uneChaineAvecValeurOptionnelleValidee = uneChaineAvecValeurOptionnelle {\nprintln(uneChaineAvecValeurOptionnelleValidee)\n} else {\nprintln(\"La variable \u2018uneChaineAvecValeurOptionnelle\u2019 n\u2019est pas initialis\u00e9e.\")\n}<\/pre>\n<p>&nbsp;<\/p>\n<hr \/>\n<p><a name=\"a5\"><\/a><\/p>\n<h1>Traitements sur les chaines de caract\u00e8res<\/h1>\n<h2>Concat\u00e9nation<\/h2>\n<pre class=\"toolbar:1 lang:swift decode:true\">let tim = \"\u00c9tudiants et \u00e9tudiantes de CSTJ.TIM\"\nlet cours = \"Introduction \u00e0 Xcode\"\nvar msgBienvenue = tim + \", bienvenue au cours : \" + cours\nmsgBienvenue += \"!\"<\/pre>\n<p><a name=\"a6\"><\/a><\/p>\n<h2>Interpolation de chaines<\/h2>\n<p><strong>Syntaxe:<\/strong><br \/>\n\u00ab\u00a0&#8230; \\(votre code) &#8230;\u00a0\u00bb<br \/>\n&nbsp;<\/p>\n<pre class=\"toolbar:1 lang:swift decode:true \">let anneeCours = 2014\nmsgBienvenue = \"\\(tim), bienvenue au cours : \\(cours) de l'ann\u00e9e \\(anneeCours)\"\nlet nbSemaines = 15\nlet heuresSemaine = 4\nlet msg = \"\u00c0 \\(heuresSemaine) heures de cours par semaine pendant \\(nbSemaines) semaines, le cours a une dur\u00e9e de \\(nbSemaines * heuresSemaine) heures.\"<\/pre>\n<p>&nbsp;<\/p>\n<h2>Comparaison de chaines<\/h2>\n<pre class=\"toolbar:1 lang:swift decode:true\">let perso1 = \"Fred \" + \"LeToff\"\nlet perso2 = \"Fred LeToff\"\nif perso1 == perso2 {\n  println(\"\\(perso1) et \\(perso2) sont une seule et m\u00eame personne\")\n} else {\n  println(\"Il n'y d\u00e9finitivement aucun lien de parent\u00e9 entre \\(perso1) et \\(perso2)\")\n}<\/pre>\n<p>&nbsp;<\/p>\n<h2>Chaines &#8211; Test insensible \u00e0 la casse<\/h2>\n<pre class=\"toolbar:1 lang:swift decode:true\">let perso1 = \"Fred \" + \"Letoff\"\nlet perso2 = \"Fred LeToff\"\nif perso1.lowercaseString == perso2.lowercaseString {\n  println(\"\\(perso1) et \\(perso2) sont une seule et m\u00eame personne\")\n} else {\n  println(\"Il n'y d\u00e9finitivement aucun lien de parent\u00e9 entre \\(perso1) et \\(perso2)\")\n}<\/pre>\n<p>&nbsp;<\/p>\n<h2>Tester des chaines vides<\/h2>\n<pre class=\"toolbar:1 lang:swift decode:true\">let jeSuisUneChaineVide = \"\"\nlet moiAussi = String()\nif jeSuisUneChaineVide.isEmpty &amp;&amp; moiAussi.isEmpty {\n  println(\"Il n'y a que du vide ici...\")\n}<\/pre>\n<p>&nbsp;<\/p>\n<hr \/>\n<p><a name=\"a7\"><\/a><\/p>\n<h1>Conversion de types<\/h1>\n<pre class=\"toolbar:1 lang:swift decode:true \">let prix:Float = 12.67\nlet quant = \"2\"\nvar total = prix * Float(quant.toInt()!)\nlet i = String(99)\nlet peutEtreunNombre = \"\".toInt()\nif let unNombre = peutEtreunNombre {\n    println(\"unNombre vaut \\(unNombre)\")\n} else\n{\n    println(\"Meilleur chance la prochaine fois...\")\n}\n\/\/ Note: pas encore de m\u00e9thode String.toDouble() avec la beta3 de Xcode 6\n\/\/ Conversion en utilisant un pond vers NSString\n\/\/ Note pas \u00e0 tester 'nil', si chaine invalide alors retourne 0.0\nlet UnDouble = (\"1.618\" as NSString).floatValue\nlet famille = \"MAISONNEUVE.TIM\"\nif (famille as NSString).containsString(\"TIM\")\n{\n    println(\"Membre de la famille...\")\n}\n\/\/ Un autre exemple de m\u00e9thodes disponibles avec la Class NSString\nlet motCache = \"swilfkjnsljfswjftswiftswjkfswftfdf\" as NSString\nmotCache.substringWithRange(NSMakeRange(7, 7))\nprintln(\"Le mot cach\u00e9 est '\\(motCache.substringWithRange(NSMakeRange(17, 5)))'\")<\/pre>\n<p>&nbsp;<\/p>\n<hr \/>\n<p><a name=\"a8\"><\/a><\/p>\n<h1>Les tableaux<\/h1>\n<p>\/\/ D\u00e9finition<\/p>\n<h2>D\u00e9finition implicite<\/h2>\n<pre class=\"lang:swift decode:true \">let jeSuisUnTableauDeChaine = [\"Tintin\", \"Milou\", \"Tournesol\"]<\/pre>\n<p>&nbsp;<\/p>\n<h2>D\u00e9finition explicite<\/h2>\n<pre class=\"lang:swift decode:true \">let jeSuisUnTabloDeChaine:Array&lt;String&gt; = jeSuisUnTableauDeChaine<\/pre>\n<p>&nbsp;<\/p>\n<h2>D\u00e9finition explicite courte<\/h2>\n<pre class=\"lang:swift decode:true \">var personnages:[String] = jeSuisUnTableauDeChaine\nvar tableauVideDesChaines:[String] = []<\/pre>\n<p>&nbsp;<\/p>\n<h2>Tableau &#8211; Utilisation<\/h2>\n<pre class=\"lang:swift decode:true \">let perso = personnages[0]\nlet dernierPerso = personnages[personnages.count - 1]\nif !personnages.isEmpty {\nprintln(\"Il y a \\(personnages.count) personnage(s) dans le tableau\")\n}<\/pre>\n<p>&nbsp;<\/p>\n<h2>Chercher la position d&rsquo;un item dans un tableau<\/h2>\n<pre class=\"lang:swift decode:true \">\/\/ Note: retourne nil si pas trouv\u00e9. Utiliser la syntaxe 'if let'\nif let trouve = find(personnages, \"Milou\") {\nprintln(\"Nous avons trouv\u00e9 Milou \u00e0 la position \\(trouve) dans le tableau des personnages\")\n}<\/pre>\n<p>&nbsp;<\/p>\n<h2>Ajouter un item dans un tableau<\/h2>\n<pre class=\"lang:swift decode:true \">personnages+=\"Haddock\"  \/\/ Ne fonctionne plus \u00e0 partir de la beta 5, il faut utiliser la syntaxe de la ligne suivante\npersonnages.append(\"Haddock\")<\/pre>\n<p>&nbsp;<\/p>\n<h2>Retirer un item du tableau<\/h2>\n<pre class=\"lang:swift decode:true \">let retrait = personnages.removeAtIndex(1)\nprintln(retrait)<\/pre>\n<p>&nbsp;<\/p>\n<h2>Vider un tableau<\/h2>\n<pre class=\"lang:swift decode:true \">personnages.removeAll(keepCapacity: true)<\/pre>\n<p>&nbsp;<\/p>\n<h2>Ins\u00e9rer un item dans un tableau<\/h2>\n<pre class=\"lang:swift decode:true\">personnages.insert(\"Malice\", atIndex: 1)\n\/\/ Remplacer un (1) ou des items du tableau\n\/\/ Dans l'exemple suivant: remplacer items 0 \u00e0 1 par ...\npersonnages[0...1] = [\"Tuntun\", \"MunLun\", \"UnDun\", \"SunSun\"] \/\/ ou 0..&lt;2\npersonnages<\/pre>\n<p>&nbsp;<\/p>\n<h2>Trier un tableau<\/h2>\n<pre class=\"lang:swift decode:true \">personnages.sort {a, b in a &lt; b} \/\/ voir 'closure'\npersonnages<\/pre>\n<p>&nbsp;<br \/>\n&nbsp;<\/p>\n<hr \/>\n<p><a name=\"a9\"><\/a><\/p>\n<h1>Les dictionnaires<\/h1>\n<p>D\u00e9finition: une collection de paires cl\u00e9\/valeur<br \/>\n\/\/ Syntaxe:<br \/>\n\/\/ &#8230; = [ cl\u00e91:valeur1, cl\u00e92:valeur2, &#8230;]<\/p>\n<h2>Dictionnaire &#8211; D\u00e9claration implicite<\/h2>\n<pre class=\"lang:swift decode:true \">var personnage01 = [ \"Nom\": \"Fred\", \"Force\": \"99\", \"Rang\":\"Novice\"]\n\/\/ Acc\u00e8s simple\npersonnage01[\"Nom\"]\n\/\/ Acc\u00e8s avec test de la cl\u00e9\nvar nom = \"\"\nlet cle = \"Nom\"\nif let temp = personnage01[cle] {\n    nom = temp\n} else\n{\n  println(\"Erreur:Cl\u00e9 '\\(cle)' invalide\")\n}\nnom\n\/\/ ********************************\nvar dict:[String:String]\ndict = [\"Nom\":\"Fred\"]\ndict[\"Age\"] = \"44\"\ndict\n<\/pre>\n<p>&nbsp;<\/p>\n<h2>Dictionnaire &#8211; D\u00e9claration explicite<\/h2>\n<pre class=\"lang:swift decode:true\">let personnage02:Dictionary&lt;String, AnyObject&gt; = [ \"Nom\": \"Tom\", \"Force\": 34, \"Rang\":\"Expert\"]<\/pre>\n<p>&nbsp;<\/p>\n<h2>D\u00e9clarer un Dictionnaire vide<\/h2>\n<pre class=\"lang:swift decode:true \">let dictioVide = Dictionary&lt;String, String&gt;()<\/pre>\n<p>&nbsp;<\/p>\n<h2>Utilisation d&rsquo;un dictionnaire<\/h2>\n<pre class=\"lang:swift decode:true\">let nomPerso1 = personnage01[\"Nom\"]\nvar tabloPerso = [personnage01, personnage02]\n\/\/ let forcePerso2 = tabloPerso[1][\"Force\"] as Int\n\/\/ Note: Il est recommand\u00e9 d'utiliser la syntaxe 'if set'. Un champ non d\u00e9fini retournera 'nil'\nlet force = \"Force\"\nif let forcePerso1 = personnage01[force]?.toInt() {\nprintln(\"La \\(force) de Perso1 = \\(forcePerso1)\")\n} else {\nprintln(\"Erreur: Impossible d'obtenir la \\(force) du personne...\")\n}\n\/\/ Utilisation d'un dictionnaire avec des \u00e9l\u00e9ments de type 'AnyObject'\nlet personnage02:Dictionary&lt;String, AnyObject&gt; = [ \"Nom\": \"Tom\", \"Force\": 34, \"Rang\":\"Expert\"]\nlet force \u00a0 = personnage02[\"Force\"] \u00a0 \u00a0 as NSNumber\nlet nom \u00a0 \u00a0 = personnage02[\"Nom\"] \u00a0 \u00a0 \u00a0 as NSString\nprintln(\"Mon nom est: \\(nom) et j'ai une force de: \\(force)\")\n<\/pre>\n<h2><\/h2>\n<h2>Un tableau de dictionnaires<\/h2>\n<pre class=\"lang:swift decode:true \">let personnage001\/*:Dictionary&lt;String, AnyObject&gt;*\/ = [ \"Nom\": \"Le petit\", \"Force\": 3, \"Rang\":\"novice\"]\nlet personnage002:Dictionary&lt;String, AnyObject&gt; = [ \"Nom\": \"Tom\", \"Force\": \"34\", \"Rang\":\"Expert\"]\nvar personnages02:Array&lt;Dictionary&lt;String, AnyObject&gt;&gt; = Array()\npersonnages02.append(personnage001)\npersonnages02.append(personnage002)\npersonnages02[0][\"Rang\"]\npersonnages02[1][\"Force\"]\nlet total = 22 + personnages02[1][\"Force\"]  \/\/ erreur!\n\/\/ Solution\nif let fp = personnages02[1][\"Force\"] as? Int {\n    let i = fp + 22\n    i\n} else\n{\n    println(\"Erreur sur le type du champ 'force'\")\n}\n<\/pre>\n<h2><\/h2>\n<h2>Un tableau d&rsquo;AnyObject<\/h2>\n<pre class=\"lang:swift decode:true\">let personnage0001 = [ \"Nom\": \"Le petit\", \"Force\": 3,  \"Rang\":\"novice\", \"Amis\": [\"Moi\",\"Toi\",\"Lui\"]]\nlet personnage0002 = [ \"Nom\": \"Le grand\", \"Force\": 78, \"Rang\":\"Expert\", \"Amis\": [\"Eux\",\"Nous\",\"Ils\"]]\nlet personnage0003 = [ \"Nom\": \"Le Boss\",  \"Force\": 99, \"Rang\":\"Expert\", \"Amis\": [\"Monstre rouge\"]]\n\/\/ AnyObject = classe de type NS\nvar personnages3:Array&lt;AnyObject&gt; = Array()\npersonnages3.append(personnage0001)\npersonnages3.append(personnage0002)\npersonnages3.append(personnage0003)\nprintln(personnages3)\npersonnages.count\nlet nom3 = personnages3[1][\"Nom\"] as! String\nlet nbAmisPerso3 = (personnages3[2][\"Amis\"] as! NSArray).count\n\/\/ Bloucler sur les \u00e9l\u00e9ments du tableau (voir 'for in')\n\/\/ for (key,value)\nfor perso in personnages3 {\n    let nomPerso = perso[\"Nom\"] as! String\n    println(\"Amis de \\(nomPerso): \")\n    for ami in perso[\"Amis\"] as! NSArray {\n        println(\"    \\(ami)\")\n    }\n    println(\"-------------\")\n}\n<\/pre>\n<p>&nbsp;<\/p>\n<h2>Ins\u00e9rer une cl\u00e9\/valeur<\/h2>\n<p>Note: Ne fonctionne qu&rsquo;avec &lt;String, String&gt;.<\/p>\n<pre class=\"lang:swift decode:true\">personnage01[\"Vies\"] = \"4\"<\/pre>\n<p>&nbsp;<\/p>\n<h2>Retirer une cl\u00e9\/valeur<\/h2>\n<p>Note: Ne fonctionne qu&rsquo;avec &lt;String, String&gt;<\/p>\n<pre class=\"lang:swift decode:true \">personnage01[\"Rang\"] = nil\npersonnage01.removeValueForKey(\"Rang\")<\/pre>\n<p>&nbsp;<\/p>\n<h3 style=\"color: #006837;\">NSSet &#8211;\u00a0Tableau sans doublon<\/h3>\n<pre class=\"lang:swift decode:true\">let personnages4 = [\"Tintin\", \"Milou\", \"Tournesol\", \"Haddock\", \"Allan\", \"Rastapopoulos\", \"Dupont\", \"Dupond\", \"Muller\", \"Lampion\", \"Tapioca\" ]\nlet unEnsemble = NSMutableSet()  \/\/ Un tableau sans doublon\nvar nbIterations = 0\nwhile unEnsemble.count &lt;= 3 {\n    let unNombreAuHasard = arc4random_uniform(UInt32(count(personnages)))\n    let unPersonnage = personnages[Int(unNombreAuHasard)]\n    println(unPersonnage)\n    unEnsemble.addObject(unPersonnage)\n    nbIterations++\n} \/\/ while unEnsemble.count &lt;= 3\nprintln(\"It\u00e9rations: \\(nbIterations), contenu de l'ensemble: \\(unEnsemble)\")<\/pre>\n<p>&nbsp;<\/p>\n<h3 style=\"color: #006837;\">NSCountedSet &#8211; calcule des doublons<\/h3>\n<pre class=\"lang:swift decode:true\">let personnages5 = [\"Tintin\", \"Milou\", \"Tournesol\", \"Haddock\", \"Allan\", \"Rastapopoulos\", \"Dupont\", \"Dupond\", \"Muller\", \"Lampion\", \"Tapioca\" ]\nlet unEnsemble2 = NSCountedSet()  \/\/ Un tableau sans doublon\nvar nbIterations2 = 0\nwhile unEnsemble2.count &lt;= 3 {\n    let unNombreAuHasard = arc4random_uniform(UInt32(count(personnages)))\n    let unPersonnage = personnages[Int(unNombreAuHasard)]\n    println(unPersonnage)\n    unEnsemble2.addObject(unPersonnage)\n    nbIterations++\n}\nfor x in unEnsemble2 {\n    println(\"Personnage: \\(x), nb d'insertions: \\(unEnsemble2.countForObject(x))\")\n}<\/pre>\n<p>&nbsp;<br \/>\nR\u00e9sultat:<\/p>\n<pre class=\"lang:swift decode:true \">Lampion\nTintin\nLampion\nDupond\nMilou\nHaddock\nMuller\nDupond\nMuller\nMuller\nTournesol\nAllan\nHaddock\nHaddock\nLampion\nDupont\nLampion\nTapioca\nPersonnage: Dupond, nb d'insertions: 2\nPersonnage: Muller, nb d'insertions: 3\nPersonnage: Lampion, nb d'insertions: 4\nPersonnage: Tintin, nb d'insertions: 1\nPersonnage: Allan, nb d'insertions: 1\nPersonnage: Milou, nb d'insertions: 1\nPersonnage: Tournesol, nb d'insertions: 1\nPersonnage: Dupont, nb d'insertions: 1\nPersonnage: Tapioca, nb d'insertions: 1\nPersonnage: Haddock, nb d'insertions: 3<\/pre>\n<p>&nbsp;<\/p>\n<h3 style=\"color: #006837;\">NSIndexSet &#8211; Un ensemble d&rsquo;indices<\/h3>\n<pre class=\"lang:swift decode:true\">let personnages = [\"Tintin\", \"Milou\", \"Tournesol\", \"Haddock\", \"Allan\", \"Rastapopoulos\", \"Dupont\", \"Dupond\", \"Muller\", \"Lampion\", \"Tapioca\" ]\nlet indexSet = NSMutableIndexSet()\nindexSet.addIndex(0)\nindexSet.addIndex(2)\nindexSet.addIndex(4)\n(personnages as NSArray).objectsAtIndexes(indexSet) \/\/ retourne; Tintin, Tournesol et Allan<\/pre>\n<p>&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<\/p>\n<hr \/>\n<h1>Contr\u00f4le de la s\u00e9quence d&rsquo;ex\u00e9cution<\/h1>\n<p><a name=\"a10\"><\/a><\/p>\n<h1>Les boucles<\/h1>\n<p>Syntaxe<\/p>\n<blockquote><p>for in range (&#8230;, ..&lt;)<\/p><\/blockquote>\n<pre class=\"lang:swift decode:true\">for inclusif in 0...5 {\nprintln(\"La valeur de inclusif 'closed range' est \\(inclusif)\")\n}\nfor exclusif in 0..&lt;5 {\nprintln(\"La valeur de exclusif 'half-open range' est \\(exclusif)\")\n}\nfor car in \"Bonjour le monde\" {\n  println(car)\n}\nlet aventuresTintin = [\"Tintin\", \"Milou\", \"Tournesol\"]\nfor indice in 0..&lt;aventuresTintin.count{\nlet msg = \"Le nom du personnage \\(indice + 1) est \\(aventuresTintin[indice])\"\n}\nfor personnage in aventuresTintin {\n let unPersonnage = personnage\n println(unPersonnage)\n}<\/pre>\n<p>&nbsp;<\/p>\n<blockquote><p><strong>for<\/strong> \u00a0(affectation; condition; incr\u00e9mentation) {}<\/p><\/blockquote>\n<p>&nbsp;<\/p>\n<pre class=\"lang:swift decode:true \">for var compteur = 0, x = 2 ; compteur &lt; aventuresTintin.count ; compteur++ {\n x*=2\n println(\"Le nom du personnage \\(compteur + 1) est \\(aventuresTintin[compteur]) et x vaut \\(x)\")\n}<\/pre>\n<p>&nbsp;<\/p>\n<h2>while et do while<\/h2>\n<p>Syntaxe<\/p>\n<blockquote><p>&#8230;<\/p><\/blockquote>\n<pre class=\"lang:swift decode:true\">var multiplesDeDeux = 2\nwhile multiplesDeDeux &lt; 16 {\nmultiplesDeDeux*=2\nprintln(multiplesDeDeux)\n}\nlet dernierePosition = 1\nvar nouvellePosition:Int\ndo {\nnouvellePosition = Int(arc4random()) % 2 \/\/ un nombre entre 0 et 1\nprintln(nouvellePosition)\n} while nouvellePosition == dernierePosition<\/pre>\n<p>&nbsp;<\/p>\n<hr \/>\n<p><a name=\"a11\"><\/a><\/p>\n<h1>Bris de s\u00e9quences (tests)<\/h1>\n<h2>if<\/h2>\n<p>Syntaxe<\/p>\n<blockquote><p>if else (if else)<\/p><\/blockquote>\n<h2>case<\/h2>\n<p>Syntaxe<\/p>\n<blockquote><p>switch valeurATester {<br \/>\ncase valeur1: code \u00e0 ex\u00e9cuter pour valeur1 &#8230;<br \/>\ncase valeur2, valeur 3: code \u00e0 ex\u00e9cuter pour valeur2 et valeur3 &#8230;<br \/>\ndefault: code si aucunes des valeurs<br \/>\n}<\/p><\/blockquote>\n<p>&nbsp;<\/p>\n<pre class=\"lang:swift decode:true\">let unPersonnage = \"Jean Valjean\"\nprint(unPersonnage)\nswitch unPersonnage {\n  case \"Tintin\", \"Milou\": println(\" fait partie des Aventures de Tintin\")\n  case \"Jean \" + \"Valjean\": println(\" est mis\u00e9rable!\")\n  default: println(\" ne fait partie de rien...\")\n}\nprintln(\"\\n\\n\")\n\/\/\/ switch sur tous les \u00e9lements d'un tableau de chaines\nlet expressionsHaddock = [\n\"Bachi-bouzouk\",\n\"Mille millions de mille sabords\",\n\"Bougres de faux jetons \u00e0 la sauce tartare\",\n\"Esp\u00e8ce de porc-\u00e9pic mal embouch\u00e9\",\n\"Patagon de zoulous\",\n\"Bougre d\u2019extrait de cornichon\",\n\"Simili-martien \u00e0 la graisse de cabestan\",\n\"Sombre oryct\u00e9rope\",\n\"Tra\u00eene-potence\",\n\"Bougres d\u2019extrait de cr\u00e9tins des Alpes\",\n]\nfor expression in expressionsHaddock {\n  print(\"'\\(expression)', est une expression \")\n  switch count(expression) {\n    case 1...15: print(\"facile\")\n    case 16..&lt;33: print(\"difficile\")\n    default: println(\"impossible\")\n  } \/\/ switch\n  println(\" \u00e0 retenir.\")\n} \/\/ for\nprintln(\"\\n\\n\")\n\/\/ boucle sur les \u00e9l\u00e9ments contenant le mot 'Bougre'\nfor expression in expressionsHaddock {\n  \/\/ N\/A \u00e0 partir de beta5: if expression.bridgeToObjectiveC().containsString(\"Bougre\")\n  if (expression as NSString).containsString(\"Bougre\")\n{\n    print(\"'\\(expression)', est une expression \")\n    switch count(expression) {\n      case 1...15: print(\"facile\")\n      case 16..&lt;33: print(\"difficile\")\n      default: println(\"impossible\")\n    } \/\/ switch\n    println(\" \u00e0 retenir.\")\n  } \/\/ if bougre\n} \/\/ for<\/pre>\n<p>&nbsp;<br \/>\n&nbsp;<\/p>\n<hr \/>\n<p><a name=\"a12\"><\/a><\/p>\n<h1>Les fonctions<\/h1>\n<blockquote><p>Syntaxe<br \/>\nfunc nomDeLaFonction (nomParam1:sonType, nomParm2:sonType, &#8230;) -&gt; typeValeurDeRetour {<br \/>\ninstruction1<br \/>\ninstruction&#8230;n<br \/>\nreturn expression<br \/>\n}<\/p><\/blockquote>\n<pre class=\"lang:swift decode:true\">func sommeDeDeuxNombres(nb1: Double, nb2: Double ) -&gt; Double {\n  \/\/ Note: nb1 et nb2 sont des constantes. Par exemple, nb++ = erreur de compilation.\n  \/\/ Il est possible de d\u00e9clarer avec 'Var', Var nb1: Double.\n  return nb1 + nb2\n} \/\/ sommeDeDeuxNombres()\nsommeDeDeuxNombres(3, 0.1415 )\nsommeDeDeuxNombres(1, 2)\n\/\/ Fonction sans param\u00e8tre et retour\nfunc minimaliste() -&gt;() {\n  println(\"Je suis minimaliste)\")\n} \/\/ minimaliste()\n\/\/ ou bien\nfunc mini() {\n  println(\"minimaliste)\")\n} \/\/ mini()<\/pre>\n<p>&nbsp;<\/p>\n<h2>Noms externes pour les param\u00e8tres<\/h2>\n<p>Prenons le cas de la fonction suivante:<\/p>\n<blockquote><p>func d\u00e9placerPersonnage(unPerso:Personnage, vitesse:Float, x:Float, y:Float){<br \/>\n&#8230;<br \/>\n}<\/p><\/blockquote>\n<p>\u00c0 la lecture de la ligne suivante par une tierce partie, les valeurs inscrites ne seront pas claires.<\/p>\n<blockquote><p>d\u00e9placerPersonnage(bob, 5, 50, 200)<\/p><\/blockquote>\n<p>Swift permet de donner des noms externes aux param\u00e8tres (un concept import\u00e9 d&rsquo;Ojective-C&rsquo;)<\/p>\n<pre class=\"lang:swift decode:true\">func deplacerPersonnage(nomPersonnage unPerso:String, aLaVitesse vitesse:Float, vers_x x:Float, et_y y:Float) {\n  let intro = \"Pour votre plus grand plaisir, nous d\u00e9placons le personnage \"\n  println(\"\\(intro) \\(unPerso) \u00e0 la position x: \\(x), y: \\(y) \u00e0 la vitesse \\(vitesse)\")\n}  \/\/ deplacerPersonnage()\ndeplacerPersonnage(nomPersonnage: \"Bob\", aLaVitesse: 99.9, vers_x: 50, et_y: 200)\n<\/pre>\n<p>Si nous voulons avoir comme nom externe, le nom du param\u00e8tre il suffit alors de le pr\u00e9c\u00e9der de &lsquo;#&rsquo;<br \/>\nPar exemple,<\/p>\n<pre class=\"lang:swift decode:true\">func deplacerPerso(#nomPersonnage:String, #aLaVitesse:Float, #vers_x:Float, #et_y:Float) {\n  let intro = \"Au risque de nous r\u00e9p\u00e9ter, nous d\u00e9placons encore une fois, le personnage \"\n  println(\"\\(intro) \\(nomPersonnage) \u00e0 la position x: \\(vers_x), y: \\(et_y) \u00e0 la vitesse \\(aLaVitesse)\")\n}\ndeplacerPerso(nomPersonnage: \"Fred\", aLaVitesse: 23, vers_x: 100, et_y: 100)<\/pre>\n<p>&nbsp;<\/p>\n<h2>Proposer, aux param\u00e8tres, une valeur par d\u00e9faut<\/h2>\n<p>Note: Il faut placer les param\u00e8tres facultatifs \u00e0 la fin de la d\u00e9claration. Un nom externe sera automatiquement attribu\u00e9 aux param\u00e8tres avec une valeur par d\u00e9faut.<\/p>\n<pre class=\"lang:swift decode:true \">func deplacerSimplement(nomPersonnage:String, aLaVitesse:Float = 50, vers_x:Float = 0, et_y:Float = 0) {\n  let intro = \"Avec les valeurs par d\u00e9faut, le personnage \"\n  println(\"\\(intro) \\(nomPersonnage) reviendra \u00e0 la maison \u00e0 la vitesse \\(aLaVitesse)\")\n}\ndeplacerSimplement(\"Milou\")\n\/\/ *************\nfunc aPlusBC(nb1:Int = 10, nb2:Int = 20, nb3:Int = 0) -&gt; Int {\n return nb1 + nb2 + nb3\n}\naPlusBC(nb2: 3)\naPlusBC(nb3:2, nb2: 3, nb1:4)\n<\/pre>\n<p>&nbsp;<\/p>\n<h2>Fonction avec un nombre variable de param\u00e8tres (variadiques)<\/h2>\n<pre class=\"lang:swift decode:true\">func unGrandMerci(#listeDesParticipants:String...){\n  let debutMessage = \"Nous tenons \u00e0 remercier \"\n  let finMessage = \"pour leur participation \u00e0 cette d\u00e9monstration.\"\n  var lesParticipants:String = \"\"\n  for participant:String in listeDesParticipants {\n    lesParticipants += participant + \",\"\n  } \/\/ for\n  println(\"\\(debutMessage) \\(lesParticipants), \\(finMessage)\")\n} \/\/ unGrandMerci()\nunGrandMerci()\nunGrandMerci(listeDesParticipants: \"Tintin\", \"Milou\", \"Tounesol\")<\/pre>\n<h2>Tester la pr\u00e9sence des param\u00e8tres variadiques<\/h2>\n<pre class=\"lang:swift decode:true\">func aditionnerLesNombresEntiersSuivants(desNombres:Int...) -&gt; Int?{\nif desNombres.count == 0 {\n  return nil\n} \/\/ if\nvar total = 0\nfor nombre in desNombres {\n  total += nombre\n} \/\/ for\n  return total\n}\nlet peutEtreUnTotal = aditionnerLesNombresEntiersSuivants(23,66, 123)\nif let total = peutEtreUnTotal {\n  println(\"La somme des nombres donne \\(total)\")\n} else {\n  println(\"Attention, pour obtenir un total, il faut fournir des nombres...\")\n} \/\/ if\n<\/pre>\n<p>&nbsp;<\/p>\n<h2>Modification de la source du param\u00e8tre<\/h2>\n<pre class=\"lang:swift decode:true\">func changerNom(unNom:String) {\n  unNom = \"Ne fait pas cela!\" \/\/ Produit une erreur car par d\u00e9faut la d\u00e9claration est de type 'let'.\n}  \/\/ changerNom()\nfunc ajouterAppel(var unNom:String, appel:String) {\n  unNom = appel + \" \" + unNom \/\/ Changera la copie du param\u00e8tre.\n} \/\/ ajouterAppel()\nvar nomNomEst = \"Jean le marin\"\najouterAppel(nomNomEst, \"Monsieur\")\nprintln(\"Mon nom est \\(nomNomEst)\")\nfunc ajouterAppel2(inout unNom:String, appel:String) {\n  unNom = appel + \" \" + unNom \/\/ Changera la variable originale.\n} \/\/ ajouterAppel2()\nvar nomNom = \"Gille Valiquette\"\najouterAppel2(&amp;nomNom, \"Monsieur\")\nprintln(\"Mon nom est \\(nomNom)\")<\/pre>\n<p>&nbsp;<\/p>\n<hr \/>\n<p><a name=\"a13\"><\/a><\/p>\n<h1>Les &lsquo;tuples&rsquo;<\/h1>\n<pre class=\"lang:swift decode:true \">let ami = (\"Fred\", \"33\", \"Bon\")\nami.0\nlet ami2 = (Nom:\"Toto\", Age:\"99\", Type:\"Ancien\")\nami2.Nom\n\/\/  Note, une fonction peut retourner un 'tuple'\nfunc uneFonction() -&gt; (String, Double){\n...\n  return (\"PI\", 3.141592)\n}\nlet (nom,valeur) = uneFonction()\n<\/pre>\n<p>&nbsp;<\/p>\n<hr \/>\n<h1>Les structures de donn\u00e9es<\/h1>\n<p>Syntaxe<\/p>\n<blockquote><p>&#8230;<\/p><\/blockquote>\n<pre class=\"toolbar:1 lang:swift decode:true\">struct StructurePersonnage {\n  var nom = \"Non d\u00e9finie\"\n  var niveau = 0\n  var force = 0.0\n  var positionX = 0.0\n  var positionY = 0.0\n  var vies:Int = 0\n} \/\/ StructurePersonnage\nvar jeSuisDeTypePersonnage = StructurePersonnage()\nvar moiAussiJeSuisDeTypePersonnage = StructurePersonnage(nom: \"Bozo le clown\", niveau: 3, force: 55, positionX: 0, positionY: 0, vies: 3)\njeSuisDeTypePersonnage.vies -= 1\nprintln(\"jeSuisDeTypePersonnage = \\(jeSuisDeTypePersonnage)\")<\/pre>\n<p>&nbsp;<\/p>\n<hr \/>\n<p><a name=\"a14\"><\/a><\/p>\n<h1>Les classes (class)<\/h1>\n<p>Syntaxe<\/p>\n<blockquote><p>&#8230;<\/p><\/blockquote>\n<pre class=\"toolbar:1 lang:swift decode:true\">class ClassePersonnage {\n  var nom = \"Non d\u00e9finie\"\n  var niveau = 0\n  var force = 0.0\n  var positionX = 0.0\n  var positionY = 0.0\n  var vies:Int = 0\n  func description() -&gt;String {\n    return \"Je suis le personnage \\(nom) et j'ai une force de \\(force).\"\n  } \/\/ description()\n  func deplacer(#vitesse:Int, posX:Float, posY:Float) {\n    println(\"\\(nom) se d\u00e9place vers (\\(posX),\\(posY)) \u00e0 la vitesse \\(vitesse).\")\n  } \/\/ deplacer()\n} \/\/ ClassePersonnage\nvar personnage = ClassePersonnage()\npersonnage.nom = \"La terreur des barbares\"\nprintln(personnage.description())\npersonnage.deplacer(vitesse: 99, posX: 100, posY: 200)<\/pre>\n<p>&nbsp;<\/p>\n<h2>struct\/class avec un constructeur<\/h2>\n<pre class=\"toolbar:1 lang:swift decode:true\">class ClassePersoAvecInit {\n  var nom:String\n  var niveau:Float\n  var force:Float\n  var positionX:Float\n  var positionY:Float\n  var vies:Int \/\/ = 0  \/\/ Va produire une erreur\n  init(unNom:String){\n    nom = unNom; niveau = 0; force = 0; positionX = 0; positionY = 0;\n  } \/\/ init(unNom:String)\n  init(unNom:String, uneForce:Float) {\n    nom = unNom;\n    force = uneForce\n    niveau = 0; positionX = 0; positionY = 0;\n  } \/\/ init(unNom:String, uneForce:Float)\n  func description() -&gt;String {\n    return \"Je suis le personnage \\(nom) et j'ai une force de \\(force).\"\n  } \/\/ description()\n} \/\/ ClassePersoAvecInit\nlet perso_01 = ClassePersoAvecInit(unNom: \"Tintin\")\nlet perso_02 = ClassePersoAvecInit(unNom: \"Milou\", uneForce: 99)<\/pre>\n<p>&nbsp;<\/p>\n<h2>Les extensions de classe<\/h2>\n<pre class=\"toolbar:1 lang:swift decode:true\">extension ClassePersoAvecInit {\n  func retourAuCamp() {\n    println(\"\\(nom) revient au camp.\")\n  }\n}\nlet perso_03 = ClassePersoAvecInit(unNom: \"Le voyageur\")\nperso_03.retourAuCamp()\n\/\/ ---------------------------------\n\/\/ Avec une classe du langage swift:\nextension String {\n    func servirARien()-&gt;String{\n        return \"Quelle perte de temps pour '\\(self)'!\"\n    } \/\/ servirARien()\n}\nlet ouf = \"\"\nouf.servirARien()\n\"allo\".servirARien()\n<\/pre>\n<p>&nbsp;<\/p>\n<h2>H\u00e9ritage<\/h2>\n<pre class=\"toolbar:1 lang:swift decode:true  \">class PersonnageComplexe:ClassePersoAvecInit {\n  func methodeQuiTue() -&gt;String {\n    return \"\\(nom) est prit d'une rage et an\u00e9antit tous ses adversaires... glup!\"\n  }\n}\nlet mechant = PersonnageComplexe(unNom: \"Boris\")\nprintln(mechant.methodeQuiTue())\n<\/pre>\n<p>&nbsp;<\/p>\n<hr \/>\n<h2>\u00c9num\u00e9rations &#8211; enum<\/h2>\n<pre class=\"lang:swift decode:true\">enum TypeDeJoueur  {\n    case Novice\n    case Inter\n    case Expert\n}\nlet joueur01:TypeDeJoueur\njoueur01 = .Novice\nif joueur01 != .Expert {\n    println(\"Le joueur n'est pas un expert\")\n} \/\/ if\nswitch joueur01 {\ncase .Novice: println(\"Le joueur est un novice\"); break\ncase .Inter: break\ncase .Expert:break\n    \/\/ Note, pas besoin de clause 'default:' car tous les choix sont \u00e9puis\u00e9s.\n} \/\/ switch<\/pre>\n<p>&nbsp;<\/p>\n<hr \/>\n<h2>Protocole &#8211;\u00a0Voir le projet <a href=\"\/xcode\/index.php\/projet-aquarium-poo-et-protocols\/\">Aquarium<\/a><\/h2>\n<p>&nbsp;<\/p>\n<hr \/>\n<h2>Observation des valeurs dans le temps<\/h2>\n<pre class=\"lang:swift decode:true\">\/\/ Exemple 1: 10 nombres al\u00e9atoires entre 0..&lt;100\nfor x in 0...10 {\n    arc4random_uniform(100)\n}\n\/\/ Un peu de trigonom\u00e9trie dans le temps...\nfor x in 0...255 {\n    let t = Double(x) * sin(Double(x) * M_PI_4\/4)\n}\nfor i in 0...180\n{\n let x = cos(Double(i) \/ M_PI_4)\n}<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1702\" src=\"\/xcode\/wp-content\/uploads\/2014\/07\/playground-valeursVSTemps.png\" alt=\"playground-valeursVSTemps\" width=\"548\" height=\"602\" \/><br \/>\n&nbsp;<br \/>\n<a href=\"https:\/\/developer.apple.com\/library\/prerelease\/mac\/documentation\/Swift\/Conceptual\/Swift_Programming_Language\/TheBasics.html#\/\/apple_ref\/doc\/uid\/TP40014097-CH5-XID_398\">R\u00e9f\u00e9rence Apple<\/a><\/p>\n<hr \/>\n<h6 style=\"text-align: right;\">Document r\u00e9dig\u00e9 par Alain Boudreault &#8211; Juillet 2014<\/h6>\n<p>&nbsp;<br \/>\n&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Note\u00a0&#8211; Article en cours de r\u00e9vision &#8211; version du 2015.09.30 Contenu Le langage de programmation Swift Le &lsquo;playground&rsquo; Concepts et syntaxe Les variables et constantes Traitements sur les cha\u00eenes de caract\u00e8res Interpolation de cha\u00eenes Conversion de types Les tableaux Les dictionnaires Les boucles Les tests (if, switch) Les fonctions Les structures de donn\u00e9es Les classes [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1065","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/ve2cuy.com\/xcode\/wp-json\/wp\/v2\/pages\/1065","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ve2cuy.com\/xcode\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ve2cuy.com\/xcode\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ve2cuy.com\/xcode\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ve2cuy.com\/xcode\/wp-json\/wp\/v2\/comments?post=1065"}],"version-history":[{"count":0,"href":"https:\/\/ve2cuy.com\/xcode\/wp-json\/wp\/v2\/pages\/1065\/revisions"}],"wp:attachment":[{"href":"https:\/\/ve2cuy.com\/xcode\/wp-json\/wp\/v2\/media?parent=1065"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}