{"id":2767,"date":"2016-08-17T10:53:01","date_gmt":"2016-08-17T14:53:01","guid":{"rendered":"\/cours\/xcode\/wp\/?page_id=2767"},"modified":"2016-08-17T10:53:01","modified_gmt":"2016-08-17T14:53:01","slug":"les-copiercoller-swift3","status":"publish","type":"page","link":"https:\/\/ve2cuy.com\/xcode\/les-copiercoller-swift3\/","title":{"rendered":"Les copier\/coller &#8211; Swift3+4"},"content":{"rendered":"<h3>Contenu<\/h3>\n<ol>\n<li><a href=\"#a1\">Afficher une trace<\/a>\u00a0et comment d\u00e9sactiver les msg du syst\u00e8me<\/li>\n<li><a href=\"#a2\">Cha\u00eene de caract\u00e8res<\/a><\/li>\n<li><a href=\"#a3\">Cha\u00eene de caract\u00e8res avec interpolation<\/a><\/li>\n<li><a href=\"#a4\">Cha\u00eene &#8211; concat\u00e9nation<\/a><\/li>\n<li><a href=\"#a5\">Cr\u00e9er un tableau \u00e0 partir d&rsquo;un fichier de propri\u00e9t\u00e9s<\/a><\/li>\n<li><a href=\"#a6\">Charger une image par programmation<\/a><\/li>\n<li><a href=\"#a7\">Cacher la barre d&rsquo;\u00e9tat (haut de l&rsquo;\u00e9cran<\/a>)<\/li>\n<li><a href=\"#a8\">Lire la s\u00e9lection d&rsquo;un UISegmentedControl<\/a><\/li>\n<li><a href=\"#a9\">Libre<\/a><\/li>\n<li><a href=\"#a10\">Revenir \u00e0 la sc\u00e8ne pr\u00e9c\u00e9dente<\/a><\/li>\n<li><a href=\"#a11\">UITableView &#8211; d\u00e9l\u00e9gation<\/a><\/li>\n<li><a href=\"#a12\">Afficher une UITableViewCell perso<\/a><\/li>\n<li><a href=\"#a13\">UICollectionView &#8211; d\u00e9l\u00e9gation<\/a><\/li>\n<li><a href=\"#a14\">Cr\u00e9er une tableau d&rsquo;images \u00e0 partir de fichiers\\(i).png et animer<\/a><\/li>\n<li><a href=\"#a15\">Cr\u00e9er une image \u00e0 partir d&rsquo;une URL &#8211; Solution bloquante et non bloquante<\/a><\/li>\n<li><a href=\"#a16\">Cr\u00e9er une tableau \u00e0 partir d&rsquo;un r\u00e9sultat JSON via le web<\/a><\/li>\n<li><a href=\"#a17\">Pr\u00e9parer un segue<\/a><\/li>\n<li><a href=\"#a18\">Ex\u00e9cuter une m\u00e9thode apr\u00e8s un d\u00e9lai<\/a><\/li>\n<li><a href=\"#a19\">Programmer un NSTimer<\/a><\/li>\n<li><a href=\"#a20\">Afficher un Alert<\/a><\/li>\n<li><a href=\"#a21\">Charger une sc\u00e8ne (NIB, XIB, View) par programmation<\/a><\/li>\n<li><a href=\"#a22\">Animer une propri\u00e9t\u00e9<\/a><\/li>\n<li><a href=\"#a23\">D\u00e9tecter une collision entre deux UIView<\/a><\/li>\n<li><a href=\"#a24\">Ins\u00e9rer une\u00a0&lsquo;View&rsquo; dans une &lsquo;View&rsquo; parent, \u00a0\u00e0 la position parentViewCount &#8211; n<\/a><\/li>\n<li><a href=\"#a25\">Obtenir l&rsquo;\u00e9l\u00e9ment d&rsquo;un dictionnaire<\/a><\/li>\n<li><a href=\"#a26\">Array &#8211; cod\u00e9 au dur<\/a><\/li>\n<li><a href=\"#a27\">Array &#8211; \u00e9num\u00e9ration rapide<\/a><\/li>\n<li><a href=\"#a28\">Dictionnary &#8211; cod\u00e9 au dur<\/a><\/li>\n<li><a href=\"#a29\">Dictionnary &#8211; \u00e9num\u00e9ration rapide<\/a><\/li>\n<li><a href=\"#a30\">Afficher heure actuelle avec format<\/a><\/li>\n<li><a href=\"#a31\">Cr\u00e9er un UIButton + event par programmation<\/a><\/li>\n<li><a href=\"#a32\">Capturer l&rsquo;\u00e9cran dans\u00a0un UIImage<\/a><\/li>\n<li><a href=\"#a33\">Poster vers Facebook<\/a><\/li>\n<li><a href=\"#a34\">Poster vers twitter<\/a><\/li>\n<li><a href=\"#a35\">Masquer le clavier<\/a><\/li>\n<li><a href=\"#a36\">Programmer une d\u00e9l\u00e9gation (UITextField)<\/a><\/li>\n<li><a href=\"#a37\">Ajouter la gestion des versions \u00e0 un projet existant<\/a><\/li>\n<li><a href=\"#a38\">Stub AppDelegate.swift pour Xcode 6.4<\/a><\/li>\n<li><a href=\"#a39\">Git \u00e0 partir du terminal (pour un projet en \u00e9quipe)<\/a><\/li>\n<li><a href=\"#a40\">Variables globales<\/a><\/li>\n<li><a href=\"#a41\">Permettre la lecture d&rsquo;une URL (\u00e0 partir de Xcode 8)<\/a><\/li>\n<li><a href=\"#a42\">Jouer un stream vid\u00e9o \u00e0 partir d&rsquo;une URL<\/a><\/li>\n<li><a href=\"#a43\">Jouer un stream audio \u00e0 partir d&rsquo;une URL<\/a><\/li>\n<li><a href=\"#a44\">Conversion swift 4 de donn\u00e9es JSON<\/a><\/li>\n<li><a href=\"#a45\">Cr\u00e9er un fichier .gitignore pour Xcode<\/a><\/li>\n<li><a href=\"#a46\">Exemple d&rsquo;utilisation de l&rsquo;API de RiotGame (donn\u00e9es sans Array)<\/a><\/li>\n<li>Introduction \u00e0 Realm<\/li>\n<li>Exemple de gestion d&rsquo;une liste de favoris utilisant Realm<\/li>\n<li>\u00a0Prendre une pause<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<hr \/>\n<p>&nbsp;<br \/>\n<a name=\"a1\"><\/a><\/p>\n<h3>1. Afficher une trace<\/h3>\n<p><a name=\"a1\"><\/a><a name=\"a1\"><\/a><\/p>\n<pre class=\"lang:default decode:true\">print(\"#Bonjour le monde...\\n\")\nlet pi = 3.141592\nprint(\"#La valeur de pi est \\(pi)\\n\")\nlet a=3, b=7\nprint(\"#\\(a) + \\(b) = \\(a+b)\\n\")\nlet unNom = \"TIM le magnifique\"\nprint(\"#\\(unNom) dit: Bonjour \");print(\"\u00e0 tous!\\n\")<\/pre>\n<p><a name=\"a1\"><\/a><br \/>\n<a name=\"a2\"><\/a><\/p>\n<blockquote><p><span style=\"color: #ff0000;\">Note<\/span>: voici comment d\u00e9sactiver les messages superflus de la\u00a0 \u00a0 \u00a0 \u00a0 console:<br \/>\nDans <strong><span style=\"color: #666699;\">Product&gt;&gt;Scheme&gt;&gt;Edit Scheme&#8230;&gt;&gt;Run&#8230;Arguments,<\/span><\/strong><br \/>\nAjouter cette variable d&rsquo;environment:<br \/>\nName: <strong>OS_ACTIVITY_MODE<\/strong>, Value: <strong>disable<\/strong><\/p><\/blockquote>\n<p><a name=\"a2\"><\/a><a name=\"a2\"><\/a><\/p>\n<h3>2. Cha\u00eene de caract\u00e8res<\/h3>\n<p><a name=\"a2\"><\/a><a name=\"a2\"><\/a><\/p>\n<pre class=\"lang:default decode:true\">let uneChaineRO = \"Je suis une chaine en lecture seule\"\nvar uneChaineRW = \"Je suis une chaine en lecture \u00e9criture\"\nvar uneChaineOC:NSString = \"Je suis une chaine Objective-C\"\nprint(\"Il y a \\(countElements(uneChaineRO)) caract\u00e8res dans uneChaineRO\")\nprint(\"Il y a \\(String(uneChaineOC.length)) caract\u00e8res dans uneChaineOC\")<\/pre>\n<p><a name=\"a2\"><\/a><br \/>\n<a name=\"a3\"><\/a><br \/>\n<a name=\"a3\"><\/a><a name=\"a3\"><\/a><\/p>\n<h3>3. Cha\u00eene de caract\u00e8res avec interpolation<\/h3>\n<p><a name=\"a3\"><\/a><a name=\"a3\"><\/a><\/p>\n<pre class=\"lang:default mark:4 decode:true\">let perso = \"Fantomas\"\nlet persoForce = 17\nvar message = \"Mon nom est \\(perso) et j'ai \\(persoForce) de force.\"<\/pre>\n<p><a name=\"a3\"><\/a><br \/>\n<a name=\"a4\"><\/a><br \/>\n<a name=\"a4\"><\/a><a name=\"a4\"><\/a><\/p>\n<h3>4. Cha\u00eene &#8211; concat\u00e9nation<\/h3>\n<p><a name=\"a4\"><\/a><a name=\"a4\"><\/a><\/p>\n<pre class=\"lang:default mark:4-5,10 decode:true\">var msg:String\nlet pi = 3.141592\nmsg = \"Bienvenue \" + \"Au cours d'intro \"\nmsg += \"du langage Swift. PI = \" + String(pi)\nvar res = \"\"\nfor car in msg {\n    res += car\n}<\/pre>\n<p><a name=\"a4\"><\/a><br \/>\n<a name=\"a5\"><\/a><br \/>\n<a name=\"a5\"><\/a><a name=\"a5\"><\/a><\/p>\n<h3>5. Cr\u00e9er un tableau avec un fichier<\/h3>\n<p><a name=\"a5\"><\/a><a name=\"a5\"><\/a><\/p>\n<pre class=\"lang:default mark:3-4 decode:true \">\/\/ \u00c9tant donn\u00e9 le fichier suivant:\n&lt;array&gt;\n  &lt;dict&gt;\n    &lt;key&gt;nom&lt;\/key&gt;\n    &lt;string&gt;Paul&lt;\/string&gt;\n    &lt;key&gt;photo&lt;\/key&gt;\n    &lt;string&gt;image01.png&lt;\/string&gt;\n    &lt;key&gt;dette&lt;\/key&gt;\n    &lt;real&gt;10.99&lt;\/real&gt;\n  &lt;\/dict&gt;\n...\n&lt;\/array&gt;\n\/\/ Cr\u00e9er un tableau avec m\u00e9thode: Swift + Foundation\nlet pathFichierPlist = NSBundle.mainBundle().pathForResource(\"liste des amis\", ofType: \"plist\")!\namis = NSArray(contentsOfFile: pathFichierPlist)\n\/\/\/ M\u00e9thode 100% swift (pas encore au point en version beta)\nvar tabloPerso:String[] = []\nlet path = NSBundle.mainBundle().pathForResource(\"personnages\", ofType: \"plist\")\ntabloPerso = NSArray(contentsOfFile: path) as String[]\nprint(tabloPerso)\ntabloPerso.append(\"Tintin\")\nprint(tabloPerso)\nprint(tabloPerso[tabloPerso.count - 1])\n\/\/ Cr\u00e9er un tableau de 'Dictionary' \u00e0 partir d'un fichier plist\n\/\/ D\u00e9finition du tableau\nvar amis:[Dictionary&lt;String,String&gt;]!\n...\n\/\/ Affectation \u00e0 partir d'un fichier\namis = NSArray(contentsOfFile: NSBundle.mainBundle().pathForResource(\"liste des amis\", ofType: \"plist\")!) as [Dictionary&lt;String,String&gt;]\n<\/pre>\n<p><a name=\"a5\"><\/a><br \/>\n<a name=\"a6\"><\/a><br \/>\n<a name=\"a6\"><\/a><a name=\"a6\"><\/a><\/p>\n<h3>6. Charger une image par programmation<\/h3>\n<p><a name=\"a6\"><\/a><a name=\"a6\"><\/a><\/p>\n<pre class=\"lang:default decode:true\">let _image = UIImage(named:\"paysage\")\nself.uneImage.image = image\n\/\/ ou bien\nself.imageView.image = UIImage(named:\"image.png\")<\/pre>\n<p><a name=\"a6\"><\/a><a name=\"a7\"><\/a><br \/>\n<a name=\"a7\"><\/a><a name=\"a7\"><\/a><\/p>\n<h3>7. Cacher la barre d&rsquo;\u00e9tat (haut de l&rsquo;\u00e9cran)<\/h3>\n<p><a name=\"a7\"><\/a><a name=\"a7\"><\/a><\/p>\n<pre class=\"lang:swift decode:true\">    override func prefersStatusBarHidden() -&gt; Bool {\n        return true\n    }\n<\/pre>\n<p><a name=\"a7\"><\/a><br \/>\n<a name=\"a8\"><\/a><br \/>\n<a name=\"a8\"><\/a><a name=\"a8\"><\/a><\/p>\n<h3>8. Lire la s\u00e9lection d&rsquo;un UISegmentedControl<\/h3>\n<p><a name=\"a8\"><\/a><a name=\"a8\"><\/a><\/p>\n<pre class=\"lang:default decode:true\">let selection =(sender as UISegmentedControl).selectedSegmentIndex<\/pre>\n<p><a name=\"a8\"><\/a><br \/>\n<a name=\"a9\"><\/a><br \/>\n<a name=\"a9\"><\/a><a name=\"a9\"><\/a><\/p>\n<h3>9. Libre<\/h3>\n<p><a name=\"a9\"><\/a><a name=\"a9\"><\/a><\/p>\n<pre class=\"lang:default decode:true\"><\/pre>\n<p><a name=\"a9\"><\/a> <a name=\"a10\"><\/a> <a name=\"a10\"><\/a><a name=\"a10\"><\/a><\/p>\n<h3>10. Revenir \u00e0 la sc\u00e8ne pr\u00e9c\u00e9dente<\/h3>\n<p><a name=\"a10\"><\/a><a name=\"a10\"><\/a><\/p>\n<pre class=\"lang:default decode:true\">@IBAction func retourParent(sender: AnyObject) {\n   self.dismissViewControllerAnimated(true, completion:nil);\n}<\/pre>\n<p><a name=\"a10\"><\/a><br \/>\n<a name=\"a11\"><\/a><br \/>\n<a name=\"a11\"><\/a><a name=\"a11\"><\/a><\/p>\n<h3>11. UITableView &#8211; d\u00e9l\u00e9gation<\/h3>\n<p><a name=\"a11\"><\/a><a name=\"a11\"><\/a><\/p>\n<pre class=\"lang:default decode:true\">\/\/ ********************************************************************\nfunc tableView(tableView: UITableView,  numberOfRowsInSection:NSInteger) -&gt; Int\n\/\/ ********************************************************************\n{\n   return tablo.count\n} \/\/ numberOfRowsInSection\n\/\/ ********************************************************************\nfunc tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -&gt; UITableViewCell!\n\/\/ ********************************************************************\n{\n  \/\/variable type is inferred\n  var cell = tableView.dequeueReusableCellWithIdentifier(\"CELL\") as? UITableViewCell\n  if !cell {\n     cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: \"modeleCellule\")\n } \/\/ !cell\n  \/\/we know that cell is not empty now so we use ! to force unwrapping\n  cell!.textLabel.text = tablo[indexPath.row]\n  cell!.detailTextLabel.text = \"Personnage de Tintin\"\n  cell!.imageView.image = UIImage(named:\"lezard\")\n  return cell\n} \/\/ cellForRowAtIndexPath<\/pre>\n<p><a name=\"a11\"><\/a><br \/>\n<a name=\"a12\"><\/a><br \/>\n<a name=\"a12\"><\/a><a name=\"a12\"><\/a><\/p>\n<h3>12. Afficher une UITableViewCell perso<\/h3>\n<p><a name=\"a12\"><\/a><a name=\"a12\"><\/a><\/p>\n<pre class=\"lang:default decode:true \">\/\/ ********************************************************************\nfunc tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -&gt; UITableViewCell!\n\/\/ ********************************************************************\n{\n  \/\/Le type de la variable est inf\u00e9r\u00e9.\n  var cell = tableView.dequeueReusableCellWithIdentifier(\"modeleCellule\") as? CellulePerso\n  if cell !=nil {  \/\/ Si nil alors\n      cell = CellulePerso(style: UITableViewCellStyle.Value1, reuseIdentifier: \"modeleCellule\")\n  } \/\/ !cell\n  \/\/\u00c0 ce point ci, cell n'est pas nil. Il faut utiliser ! pour la d\u00e9baller\n  cell!.c1.text = tablo[indexPath.row]\n  cell!.c2.text = \"Personnage de Tintin\"\n  cell!.uneImage.image = UIImage(named:\"lezard\")\n  return cell\n} \/\/ cellForRowAtIndexPath<\/pre>\n<p><a href=\"\/xcode\/wp-content\/uploads\/2014\/06\/cc-cellule.perso_.03.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-857\" src=\"\/xcode\/wp-content\/uploads\/2014\/06\/cc-cellule.perso_.03.png\" alt=\"cc-cellule.perso.03\" width=\"260\" height=\"97\" \/><\/a><br \/>\n<a href=\"\/xcode\/wp-content\/uploads\/2014\/06\/cc-cellule.perso_.01.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-858\" src=\"\/xcode\/wp-content\/uploads\/2014\/06\/cc-cellule.perso_.01.png\" alt=\"cc-cellule.perso.01\" width=\"469\" height=\"75\" \/><\/a><br \/>\n<a href=\"\/xcode\/wp-content\/uploads\/2014\/06\/cc-cellule.perso_.02.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-856\" src=\"\/xcode\/wp-content\/uploads\/2014\/06\/cc-cellule.perso_.02.png\" alt=\"cc-cellule.perso.02\" width=\"248\" height=\"99\" \/><\/a><br \/>\n<a name=\"a13\"><\/a><\/p>\n<h3>13. UICollectionView &#8211; d\u00e9l\u00e9gation<\/h3>\n<p><a name=\"a13\"><\/a><a name=\"a13\"><\/a><\/p>\n<pre class=\"lang:default decode:true\">\/\/ ********************************************************************\nfunc collectionView(collectionView: UICollectionView?, numberOfItemsInSection section: Int) -&gt; Int\n\/\/ ********************************************************************\n{\n   return tablo.count\n}\n\/\/ ********************************************************************\nfunc collectionView(collectionView: UICollectionView?, cellForItemAtIndexPath indexPath: NSIndexPath?) -&gt; UICollectionViewCell?\n\/\/ ********************************************************************\n{\n  let cell = collectionView?.dequeueReusableCellWithReuseIdentifier(\"uneCellule\", forIndexPath: indexPath) as CellulePersoCV\n  \/\/ Configuration de la cellule\n  cell.c1.text = String(itemCourant)\n  cell.c2.text = String(indexPath!.row)\n  cell.c3.text = tablo[indexPath!.row]\n  return cell\n}<\/pre>\n<p>&nbsp;<\/p>\n<h3><a name=\"a14\"><\/a>\u00a014. Cr\u00e9er une tableau d&rsquo;images \u00e0 partir de fichiers000(i).png et animer<\/h3>\n<pre class=\"lang:default decode:true\">let DUREE_ANIMATION = 1 as NSTimeInterval\nlet ANIMATION_NB_FOIS = 3\nvar tabloImages = UIImage[]()\nfor i in 1...28 {\n  tabloImages.append(UIImage(named:\"warrior_walk_\\(i).png\"))\n}\n\/\/ Renseigner l'image \u00e0 partir du tableau et d\u00e9marrer l'animation\nuneImageAnimee.animationImages = tabloImages\nuneImageAnimee.animationRepeatCount = ANIMATION_NB_FOIS\nuneImageAnimee.animationDuration = DUREE_ANIMATION\nuneImageAnimee.startAnimating()<\/pre>\n<p>&nbsp;<\/p>\n<h3><a name=\"a15\"><\/a>\u00a015. Cr\u00e9er une image \u00e0 partir d&rsquo;une URL<\/h3>\n<pre class=\"lang:default decode:true\">\/\/ Cr\u00e9er un UIImage \u00e0 partir du WEB\n\/\/ Solution bloquante\n\/\/ ** Solution 1: Forme courte\nlet uneURL:NSURL = NSURL(string:\"http:\/\/hmp.me\/dtm\")\nuneImageURL.image = UIImage(data:NSData(contentsOfURL:uneURL));\n\/\/ ** Solution 2: Forme longue avec validation\nlet uneURL:NSURL = NSURL(string:\"http:\/\/hmp.me\/dtm\")\nvar err:NSError?\nlet htmlData = NSData.dataWithContentsOfURL(uneURL, options: NSDataReadingOptions.DataReadingMappedIfSafe, error: &amp;err)\nuneImageURL.image = UIImage(data:htmlData)\n\/\/ ** Solution 3 - non bloquante\nlet uneURL:NSURL = NSURL(string:\"http:\/\/hmp.me\/dtm\")\nlet request:NSURLRequest = NSURLRequest(URL:uneURL)\nlet queue:NSOperationQueue = NSOperationQueue()\nNSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -&gt; Void in\n           self.uneImageURL.image = UIImage(data:data)\n       })<\/pre>\n<p>&nbsp;<\/p>\n<h3><a name=\"a16\"><\/a>\u00a016. Cr\u00e9er une tableau \u00e0 partir d&rsquo;un r\u00e9sultat JSON via le web<\/h3>\n<pre class=\"lang:default decode:true\">\/\/ Obtenir la m\u00e9t\u00e9o de Montr\u00e9al via l'API Yahoo\nlet urlString = \"http:\/\/query.yahooapis.com\/v1\/public\/yql?q=select%20item%20from%20weather.forecast%20where%20location%3D%22CAXX0301%22&amp;format=json\"\nlet request:NSURLRequest = NSURLRequest(URL:NSURL(string: urlString))\nlet queue:NSOperationQueue = NSOperationQueue()\nNSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -&gt; Void in\n  var err: NSError?\n  var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &amp;err) as NSDictionary\n  if(err?) {\n     \/\/ Si erreur de conversion JSON alors afficher l'erreur\n     print(\"JSON Error (err!.localizedDescription)\")\n  }\n  print(\"===&gt; r\u00e9sultat JSON:\\n\\n \\(jsonResult)\")\n})<\/pre>\n<p>&nbsp;<\/p>\n<h3><a name=\"a17\"><\/a>\u00a017. Pr\u00e9parer un segue<\/h3>\n<pre class=\"lang:default decode:true \">\/\/ Lanc\u00e9e automatiquement avant une transition 'segue'\n\/\/ -------------------------------------------------------------\n\/\/ Exemple pour une s\u00e9lection \u00e0 partir d'un UITableView\n\/\/ ********************************************************************\noverride func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!)\n\/\/ ********************************************************************\n{\n  \/\/ Pointer sur la sc\u00e8ne de destination\n  let sceneDestination = segue.destinationViewController as ClasseSceneDestination\n  \/\/ sender -&gt; pointe sur la cellule s\u00e9lectionn\u00e9e\n  let selectionCourante = self.unTableView.indexPathForCell(sender as UITableViewCell).row;\n  \/\/ Envoyer les informations \u00e0 la sc\u00e8ne de destination\n  sceneDestination.tablo = tablo\n  sceneDestination.itemCourant = selectionCourante\n}  \/\/ prepareForSegue\n\/\/ -------------------------------------------------------------\n\/\/ Exemple pour une s\u00e9lection \u00e0 partir d'un UICollectionView\nvar _selection = 0\n\/\/ ********************************************************************\noverride func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!)\n\/\/ ********************************************************************\n{\n  \/\/ Pointer sur la sc\u00e8ne de destination\n  let sceneDestination = segue.destinationViewController as Scene03\n  \/\/ indice cellule s\u00e9lectionn\u00e9e via shouldSelectItemAtIndexPath\n  let selectionCourante =  _selection;\n  \/\/ Envoyer les informations de la s\u00e9lection courante\n  sceneDestination.title = tablo[selectionCourante]\n}\n\/\/ ********************************************************************\nfunc collectionView(collectionView: UICollectionView?, shouldSelectItemAtIndexPath indexPath: NSIndexPath?) -&gt; Bool\n\/\/ ********************************************************************\n{\n  _selection = indexPath!.row\nreturn true\n}<\/pre>\n<p>&nbsp;<\/p>\n<h3><a name=\"a18\"><\/a>\u00a018. Ex\u00e9cuter une m\u00e9thode apr\u00e8s un d\u00e9lai<\/h3>\n<pre class=\"lang:default decode:true \">DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {\n                self.tournerLaPage(\"page2\")\n            }\n\/\/ ****************************************************\nfunc tournerLaPage(scene:String) {\n        print(\"Tourner la page \u00e0 \\(scene)\")\n        performSegueWithIdentifier(scene, sender: self)\n}<\/pre>\n<p>&nbsp;<\/p>\n<h3><a name=\"a19\"><\/a>19. \u00a0Programmer un NSTimer<\/h3>\n<pre class=\"lang:default decode:true\">override func viewDidLoad() {\n   super.viewDidLoad()\n   Timer.scheduledTimer(timeInterval: 2, target: self, selector: #selector(Intro.passerAuMenuPrincipal), userInfo: nil, repeats: false)\n} \/\/ viewDidLoad()\nfunc passerAuMenuPrincipal(){\n   performSegue(withIdentifier: \"versMenuPrincipal\", sender: self)\n} \/\/ passerAuMenuPrincipal<\/pre>\n<p>&nbsp;<\/p>\n<h3><a name=\"a20\"><\/a>\u00a020. Afficher un Alert<\/h3>\n<pre class=\"lang:default decode:true \">\/\/ Nouvelle m\u00e9thode propos\u00e9e avec Swift\nlet alert = UIAlertController(title: \"Title\", message: \"Message\", preferredStyle: UIAlertControllerStyle.alert)\nalert.addAction(UIAlertAction(title: \"Button\", style: UIAlertActionStyle.default, handler: nil))\n\/\/ Patch temporaire pour Xcode 8b5; utilisation de 'DispatchQueue' pour ex\u00e9cuter le self.present()\nDispatchQueue.main.async( execute: { self.present(alert,  animated: true, completion: nil) } )\n\/\/ Ancien m\u00e9thode inspir\u00e9e d'Objective-C\nvar alert2 = UIAlertView()\nalert2.title = \"Un titre\"\nalert2.message = \"Un message\"\nalert2.addButtonWithTitle(\"ok\")\nalert2.show()<\/pre>\n<p>&nbsp;<\/p>\n<h3><a name=\"a21\"><\/a>\u00a021. Charger un NIB par programmation<\/h3>\n<pre class=\"lang:default decode:true\">var uneView = UINib(nibName: \"Magazine01\", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as UIView\n\/\/ Pour ajouter \u00e0 la sc\u00e8ne courante:\nview.addSubview(uneView);<\/pre>\n<p>&nbsp;<\/p>\n<h3><a name=\"a22\"><\/a>\u00a022. Animer une propri\u00e9t\u00e9<\/h3>\n<pre class=\"lang:default decode:true\">animerImage(self.uneImage)\n\/\/ ****************************************\nfunc animerObjet (objet:UIView){\n   UIView.animateWithDuration(\n             2,\n             animations: { objet.alpha = 0.5 },\n             completion: { finished in\n                           objet.hidden = false }\n   ) \/\/ UIView\n   UIView.animateWithDuration(\n             1,\n             delay:1,\n             options:UIViewAnimationOptions.CurveEaseIn,\n             animations: { objet.center.x = objet.center.x + 50},\n             completion: { _ in\n                           \/\/ Code \u00e0 ex\u00e9cuter lorsque animation termin\u00e9e\n                           \/\/ Par exemple, une autre animation.\n                         }\n    ) \/\/ UIView\n}  \/\/ animerImage<\/pre>\n<p>&nbsp;<br \/>\n&nbsp;<\/p>\n<h3><a name=\"a23\"><\/a>\u00a023. D\u00e9tecter une collision entre deux UIView<\/h3>\n<pre>CGRect personnage = [[lePersonnage.layer presentationLayer]frame];\nCGRect sousZone = CGRectInset(personnage, personnage.size.width\/2,personnage.size.height\/2 );\nif (CGRectIntersectsRect(sousZone, unObjet.frame))\n{\n  NSLog(@\"Il y a eu collision entre le personnage et %@\", unObjet.class);\n}<\/pre>\n<p>&nbsp;<br \/>\n<a name=\"a24\"><\/a><\/p>\n<h3>24. Ins\u00e9rer une subView \u00e0 la position parentViewCount &#8211; n<\/h3>\n<pre class=\"lang:default decode:true\">view.insertSubview(uneView, atIndex: view.subviews.count - 1)<\/pre>\n<p>&nbsp;<br \/>\n<a name=\"a25\"><\/a><\/p>\n<h3>25. Obtenir l&rsquo;\u00e9l\u00e9ment d&rsquo;un dictionnaire<\/h3>\n<pre class=\"lang:default decode:true\">if let tt = jsonResult[\"query\"]![\"results\"]![\"channel\"]![\"item\"]![\"condition\"]![\"temp\"]! as String!\n{\n   print(\"Temp\u00e9rature actuelle pour Montr\u00e9al: \\(tt)\")\n}<\/pre>\n<p>&nbsp;<br \/>\n<a name=\"a26\"><\/a><\/p>\n<h3>26. NSArray &#8211; cr\u00e9er au dur<\/h3>\n<pre class=\"lang:default decode:true\">var tablo = [\"Bob\", \"Binne\", \"Tintin\", \"Milou\", \"Hadock\", \"Castafiore\", \"Allan\", \"Tounesol\", \"Alcazar\", \"Barnab\u00e9\", \"Baxter\", \"Bill\",\"Bohlwinkel\", \"Cipa\u00e7alouvishni\"]\n\/\/ Pour ajouter un \u00e9l\u00e9ment\ntablo.append(\"Objectif Lune\")\n\/\/ Ou\ntablo+=\"encore\"\n\/\/ Pour un NSArray\nvar tabloNSArray:NSMutableArray = [\"Tintin\", \"et\", \"Milou\"]\ntabloNSArray.addObject(\"Coke en stock\")<\/pre>\n<p>&nbsp;<br \/>\n<a name=\"a27\"><\/a><\/p>\n<h3>27. NSArray &#8211; \u00e9num\u00e9ration rapide<\/h3>\n<pre class=\"lang:default decode:true\">\/\/ \u00c9num\u00e9ration des \u00e9l\u00e9ments d'un tableau\nfor item in tablo) {\n    print(\"Item: \\(item)\")\n}\n\/\/ \u00c9num\u00e9ration des \u00e9l\u00e9ments d'un tableau avec indice\nfor (index, value) in enumerate(tablo) {\n    print(\"Item \\(index + 1): \\(value)\")\n}<\/pre>\n<p>&nbsp;<br \/>\n<a name=\"a28\"><\/a><\/p>\n<h3>28. NSDictionnary &#8211; cr\u00e9er au dur<\/h3>\n<pre class=\"lang:default decode:true\">var dictio = [\"Nom\":\"Paul\", \"Age\":22, \"Titre\":\"Int\u00e9grateur\", \"Exp\u00e9rience\":2]\n\/\/ Ajouter un \u00e9l\u00e9ment\ndictio[\"Compagnie\"] = \"TIM\"\nvar dictio2:NSDictionary = [\"Nom\":\"Paul\", \"Age\":22, \"Titre\":\"Int\u00e9grateur\", \"Exp\u00e9rience\":2]<\/pre>\n<p>&nbsp;<br \/>\n<a name=\"a29\"><\/a><\/p>\n<h3>29. NSDictionnary\u00a0&#8211; \u00e9num\u00e9ration rapide<\/h3>\n<pre>\/\/Pour parcourir les \u00e9l\u00e9ments d'un dictionnaire\nfor(NSString * key in unDictionnaire){\n   NSLog(@\"cl\u00e9: %@, contenu: %@\", key, unDictionnaire[key]);\n}<\/pre>\n<p>&nbsp;<br \/>\n<a name=\"a30\"><\/a><\/p>\n<h3>30. Afficher heure actuelle avec format<\/h3>\n<pre class=\"lang:default decode:true\">\/\/ ******************************************\nfunc obtenirHeure() -&gt; String {\n  let unFormateurDeDate = NSDateFormatter()\n  unFormateurDeDate.dateFormat = \"'Nous sommes 'EEEE' et il est 'hh:mm:ss\";\n  unFormateurDeDate.locale = NSLocale(localeIdentifier: \"en_US_POSIX\")\n  return unFormateurDeDate.stringFromDate(NSDate())\n}  \/\/ obtenirHeure\nprint(obtenirHeure())\n\/\/ Ou en ajoutant une nouvelle m\u00e9thode \u00e0 la Classe NSDate\nextension NSDate\n{\n    convenience\n      init(dateString:String) {\n      let dateStringFormatter = NSDateFormatter()\n      dateStringFormatter.dateFormat = \"yyyy-MM-dd\"\n      dateStringFormatter.locale = NSLocale(localeIdentifier: \"en_US_POSIX\")\n      let d = dateStringFormatter.dateFromString(dateString)\n      self.init(timeInterval:0, sinceDate:d)\n    }\n }<\/pre>\n<p>&nbsp;<br \/>\n<a name=\"a31\"><\/a><\/p>\n<h3>31. Cr\u00e9er un UIButton + event par programmation<\/h3>\n<pre class=\"lang:default decode:true\">\/\/ ********************************************************\nfunc creerBouton(texte:String, action:String) -&gt; UIButton {\n  let unBouton   = UIButton.buttonWithType(UIButtonType.System) as UIButton\n  unBouton.frame = CGRectMake(100, 100, 100, 50)\n  unBouton.backgroundColor = UIColor(red: 45\/255, green: 23\/255, blue: 111\/255, alpha: 1.0)\n  unBouton.setTitle(texte, forState: UIControlState.Normal)\n  unBouton.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Normal)\n  unBouton.addTarget(self, action: Selector(action), forControlEvents: UIControlEvents.TouchUpInside)\n  return unBouton\n} \/\/ creerBouton\n\/\/ ********************************************************\nfunc boutonAction(sender:UIButton!)\n{\n  print(\"Action du bouton maison!\")\n}\n\/\/ Utilisation\nself.view.addSubview(creerBouton(\"Victoire!\", action: \"boutonAction:\"))<\/pre>\n<p><a name=\"a32\"><\/a><\/p>\n<h3>32. Copier l&rsquo;\u00e9cran dans\u00a0un UIImage<\/h3>\n<pre class=\"toolbar:1 lang:default decode:true\">var imageFinale = UIImage()\n    func sauvegarderEcran(){\n        \/\/ Description : m\u00e9thode servant \u00e0 capturer l\u2019\u00e9cran et au besoin,\n        \/\/ en faire une sauvegarde dans l\u2019album photos.\n        \/\/ Cacher le menu\n        leMenu!.isHidden = true\n        \/\/ 1 - Pr\u00e9parer un contexte de dessin \u00e0 partir de la taille de la sc\u00e8ne\n        UIGraphicsBeginImageContext(self.view.bounds.size);\n        \/\/ 2 \u2013 Dessiner \u00e0 partir du claque par d\u00e9faut de la sc\u00e8ne\n        self.view.layer.render(in: UIGraphicsGetCurrentContext()!);\n        \/\/ 3 \u2013 Stocker le r\u00e9sultat dans notre objet local\n        imageFinale = UIGraphicsGetImageFromCurrentImageContext()!;\n        \/\/ 5 \u2013 Fermer le contexte de dessin\n        UIGraphicsEndImageContext();\n        \/\/ 6 \u2013 Facultatif - Stocker une copie de la capture d\u2019\u00e9cran dans l\u2019album photos\n        \/\/ Note:  \u00c0 partir de iOS 10: Info.plist doit contenir une cl\u00e9 'NSPhotoLibraryUsageDescription' de type 'String' qui indique \u00e0 l'utilisateur comment sera utilis\u00e9 sa librairie de photos.\n        UIImageWriteToSavedPhotosAlbum(imageFinale, nil, nil, nil );\n        leMenu!.isHidden = false\n    } \/\/ sauvegarderEcran\n<\/pre>\n<p><a name=\"a33\"><\/a><\/p>\n<h3>33. Poster vers Facebook<\/h3>\n<pre class=\"toolbar:1 lang:default decode:true\">import Social\n    func posterSurFacebook() {\n        \/\/ Les \u00e9tapes pour utiliser \u2018facebook\u2019\n        \/\/ 1 - Tester si le service et les informations de connexion sont dispo\n        if SLComposeViewController.isAvailable(forServiceType: SLServiceTypeFacebook)\n        {\n            \/\/ 2 - Cr\u00e9er un feuille pour le 'post'\n            if let controleur = SLComposeViewController (forServiceType: SLServiceTypeFacebook) {\n                \/\/ 3 - Composer le message\n                controleur.setInitialText(\"Test avec Swift et Xcode\");\n                self.present(controleur, animated: true, completion: nil);\n                \/\/ 4 - Ajouter une image - facultatif\n                controleur.add(imageFinale);\n                \/\/ 5 - Ajouter un lien - facultatif\n                controleur.add(NSURL(fileURLWithPath: \"http:\/\/tim.cstj.qc.ca\") as URL!);\n                \/\/ 6 - Pr\u00e9senter la fen\u00eatre de confirmation \u00e0 l'utilisateur\n                \/\/ self.present(controleur, animated: true, completion: nil);  \/\/ Ne fonctionne pas pour fb sous Xcode 8B5\n                \/\/ Par contre, fonctionne pour twitter.\n                \/\/ Temporairement utiliser:\n                self.navigationController?.pushViewController(controleur, animated: true)\n            }\n        } \/\/ if Facebook\n    } \/\/ posterSurFacebook\n<\/pre>\n<p>&nbsp;<br \/>\n<a name=\"a34\"><\/a><\/p>\n<h3>34. Poster vers twitter<\/h3>\n<pre class=\"toolbar:1 lang:default decode:true \">import Social\n    func posterSurTwitter() {\n        \/\/ Les \u00e9tapes pour utiliser \u2018twitter\u2019\n        \/\/ 1 - Tester si le service et les informations de connexion sont dispo\n        \/\/ let sl = SLComposeViewController(for)\n        if SLComposeViewController.isAvailable(forServiceType: SLServiceTypeTwitter)\n        {\n            \/\/ 2 - Cr\u00e9er un feuille pour le 'post'\n            if let tweetSheet = SLComposeViewController (forServiceType: SLServiceTypeTwitter) {\n                \/\/ 3 - Composer le message\n                tweetSheet.setInitialText(\"CSTJ.TIM - Production sur support 2017. Introduction \u00e0 Xcode 9 #CSTJ\");\n                \/\/ 4 - Ajouter une image - facultatif\n                tweetSheet.add(imageFinale);\n                \/\/ 5 - Ajouter un lien - facultatif\n                \/\/tweetSheet.add(NSURL(File:\"http:\/\/tim.cstj.qc.ca\"));\n                \/\/ 6 - Pr\u00e9senter la fen\u00eatre de confirmation \u00e0 l'utilisateur\n                self.present(tweetSheet, animated: true, completion: nil);\n            }\n        } \/\/ if twitter disponible ...\n    } \/\/ posterSurTwitter\n<\/pre>\n<p><a name=\"a35\"><\/a><\/p>\n<h3>35. Masquer le clavier<\/h3>\n<pre class=\"lang:swift decode:true \">\/\/ Note: il faut aussi renseigner le 'delegate' de l'objet\nfunc textFieldShouldReturn(textField:UITextField!) -&gt; Bool{\n  textField.resignFirstResponder()\n  return true\n}\n<\/pre>\n<p><a name=\"a36\"><\/a><\/p>\n<h3>36. Programmer une d\u00e9l\u00e9gation (UITextField)<\/h3>\n<pre class=\"lang:swift mark:2,8,12 decode:true\">import UIKit\nclass ViewController: UIViewController, UITextFieldDelegate  {\n    @IBOutlet weak var unChamp: UITextField!\n    var nbRetours = 0\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        unChamp.delegate = self\n    }  \/\/ viewDidLoad\n    \/\/\/ Programmer une d\u00e9l\u00e9gation\n    func textFieldShouldReturn(textField: UITextField!) -&gt; Bool  {\n        print(\"La touche 'Return' a \u00e9t\u00e9 appuy\u00e9e \\(++nbRetours) fois.\")\n        return true\n    } \/\/textFieldShouldReturn\n}  \/\/ ViewController\n<\/pre>\n<p>&nbsp;<\/p>\n<h3>37. Ajouter la gestion des versions \u00e0 un projet existant<\/h3>\n<pre class=\"lang:swift decode:true \"># \u00c0 partir de l'app 'terminal', naviguer vers le dossier parent du projet et saisir les commandes suivantes:\ngit init\ngit add .\ngit commit -m \"Premier 'Commit'\"\n<\/pre>\n<h3><\/h3>\n<h3>38. Stub AppDelegate.swift pour Xcode 6.4<\/h3>\n<pre class=\"lang:swift decode:true \">\/\/  AppDelegate.swift\n\/\/  stub\nimport UIKit\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n    var window: UIWindow?\n    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -&gt; Bool {\n        return true\n    } \/\/ didFinishLaunchingWithOptions\n    func applicationWillResignActive(application: UIApplication)    {  }\n    func applicationDidEnterBackground(application: UIApplication)  {  }\n    func applicationWillEnterForeground(application: UIApplication) {  }\n    func applicationDidBecomeActive(application: UIApplication)     {  }\n    func applicationWillTerminate(application: UIApplication)       {  }\n} \/\/ class AppDelegate:<\/pre>\n<h3><\/h3>\n<h3>39. Git \u00e0 partir du terminal (pour le travail d&rsquo;\u00e9quipe)<\/h3>\n<pre class=\"lang:swift decode:true \">\u00c9tapes:\n1 - Creer un 'repo' sur github avec un Readme et ignore 'swift'\n2 - Creer le projet sous Xcode avec l'option 'git'\n3 - Avec terminal, cd vers le dossier du projet taper:\n  git init\n  git remote add origin https:\/\/github.com\/votre compte\/le projet.git\n  git pull origin master\n  git add *\n  git commit -m \"commit de depart\"\n4 - dand Xcode, faire un push\n\/\/ Pour le deuxieme membre de l'\u00e9quipe faire:\nSource control -&gt; check out\n\/\/ gestion des conflits\n<blockquote data-secret=\"I69J1bm6zD\" class=\"wp-embedded-content\"><a href=\"http:\/\/roadfiresoftware.com\/2015\/09\/automatically-resolving-git-merge-conflicts-in-xcodes-project-pbxproj\/\">Automatically resolving git merge conflicts in Xcode&#8217;s project.pbxproj file<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" src=\"http:\/\/roadfiresoftware.com\/2015\/09\/automatically-resolving-git-merge-conflicts-in-xcodes-project-pbxproj\/embed\/#?secret=I69J1bm6zD\" data-secret=\"I69J1bm6zD\" width=\"600\" height=\"338\" title=\"&#8220;Automatically resolving git merge conflicts in Xcode&#8217;s project.pbxproj file&#8221; &#8212; Roadfire Software\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n\/\/ Pousser les 'tags' vers le remote:\ngit push origin --tags\n<\/pre>\n<h3>40. Variables globales<\/h3>\n<p>Ajouter une classe ou une structure au projet qui contient des propri\u00e9t\u00e9s statiques:<\/p>\n<pre class=\"lang:swift decode:true \">\/\/ Fichier Static.swift\nstruct Static {\n    static var i = 99\n}\n\/\/\/  Exemple d'utilisation:\noverride func viewDidAppear(animated: Bool) {\n    Static.i = 123\n    print(Static.i)\n}\n<\/pre>\n<h3>41. Permettre la lecture d&rsquo;une URL (\u00e0 partir de Xcode 8)<\/h3>\n<p>Dans le cas du message d&rsquo;erreur suivante, suite \u00e0 la lecture de contenu \u00e0 partir d&rsquo;une URL externe,<\/p>\n<blockquote><p><b>App Transport Security has blocked a cleartext HTTP (http:\/\/) resource load since it is insecure. Temporary exceptions can be configured via your app&rsquo;s Info.plist file.<\/b><\/p><\/blockquote>\n<p><span style=\"color: #008000;\">Il faut ajouter la cl\u00e9 suivante dans le fichier<\/span> <span style=\"color: #ff0000;\"><strong>info.plist<\/strong> <span style=\"color: #008000;\">de votre projet<\/span>;<\/span><\/p>\n<blockquote><p>&lt;key&gt;NSAppTransportSecurity&lt;\/key&gt;<br \/>\n&lt;dict&gt;<br \/>\n&lt;key&gt;NSAllowsArbitraryLoads&lt;\/key&gt;<br \/>\n&lt;true\/&gt;<br \/>\n&lt;\/dict&gt;<\/p><\/blockquote>\n<p><a name=\"a42\"><\/a><\/p>\n<h3>42. Jouer un stream vid\u00e9o \u00e0 partir d&rsquo;une URL<\/h3>\n<pre class=\"lang:swift decode:true \">\/\/  Exemple d'un vid\u00e9o stream \u00e0 partir d'une URL\n\/\/  Created by Alain on 16-11-25.\nimport UIKit\nimport MediaPlayer\nimport AVKit\nclass ViewController: UIViewController {\n    override func viewDidLoad() {\n    let url = URL(string: \"http:\/\/jplayer.org\/video\/m4v\/Big_Buck_Bunny_Trailer.m4v\")!\n    \/\/ Note, si la vid\u00e9o est locale, il faut construire l'URL ainsi:\n    \/\/ let url = Bundle.main.url(forResource: \"piano\", withExtension: \"m4v\")!\n    let player = AVPlayer(url: url)\n    let playerViewController = AVPlayerViewController()\n    playerViewController.player = player\n    playerViewController.view.frame = CGRect(x: 0, y: 0, width: 640, height: 480)\n    \/\/ Ou bien ceci pour ajuster la vid\u00e9o \u00e0 sa view\n    playerViewController.view.frame = uneViewServantAAfficherLaVideo.bounds\n    self.view.addSubview(playerViewController.view)\n    \/\/ Facultatif, Ajouter le panneau de control de la vid\u00e9o\n    self.addChildViewController(playerViewController)\n    player.play()\n } \/\/ viewDidLoad\n} \/\/ ViewController\n\/\/\/ **************************************************\n\/\/\/ Ou bien \u00e0 partir d'un AVPlayerViewControler\n\/\/\/ Note: La vid\u00e9o occupera 100% de l'espace de la vue\nimport UIKit\nimport MediaPlayer\nimport AVKit\nclass MyPlayer: AVPlayerViewController {\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        let url = URL(string: \"http:\/\/jplayer.org\/video\/m4v\/Big_Buck_Bunny_Trailer.m4v\")!\n        self.player = AVPlayer(url: url) \/\/player\n        self.player?.play()\n    } \/\/ viewDidLoad\n} \/\/ MyPlayer<\/pre>\n<p>Il y a un exemple complet <a href=\"https:\/\/github.com\/ve2cuy\/JouerUneVideoWebOuLocale\">ici<\/a><br \/>\n<a name=\"a43\"><\/a><\/p>\n<h3>43.\u00a0Jouer un stream audio \u00e0 partir d&rsquo;une URL<\/h3>\n<p><a href=\"https:\/\/github.com\/teodorpatras\/Jukebox\">Sur GitHub ici<\/a><\/p>\n<h3><\/h3>\n<p><a name=\"a44\"><\/a><\/p>\n<h3>44. Conversion swift 4 de donn\u00e9es JSON<\/h3>\n<p>\u00c9tant donn\u00e9 l&rsquo;URL:<a href=\"http:\/\/prof-tim.cstj.qc.ca\/cours\/xcode\/sources\/apitim.php?mode=rnd&amp;quant=5&amp;format=json\">\u00a0http:\/\/prof-tim.cstj.qc.ca\/cours\/xcode\/sources\/apitim.php?mode=rnd&amp;quant=5&amp;format=json<\/a><br \/>\n\u00c9tant donn\u00e9 les classes suivantes:<\/p>\n<pre class=\"lang:swift decode:true \">struct YahooFinance: Codable {\n    var query: Query\n}\nstruct Query:Codable {\n    var count:      Int\n    var created:    String\n    var lang:       String\n    var results:    Results\n}\nstruct Results:Codable {\n    var quote: Array&lt;Quote&gt;\n}\nstruct Quote:Codable {\n    var Symbol: String\n    var Ask:    Float?\n}<\/pre>\n<p>Chargement des donn\u00e9es:<\/p>\n<pre class=\"lang:swift decode:true\">extension ViewController {\n    \/\/MARK:- Obtenir les donn\u00e9es\n    \/\/ =======================================================\n    func obtenirLaCitationDuJour(){\n       let uneURL = \"http:\/\/prof-tim.cstj.qc.ca\/cours\/xcode\/sources\/apitim.php?mode=rnd&amp;quant=5&amp;format=json\"\n        if let _data = NSData(contentsOf: URL(string: uneURL)!) as Data? {\n            \/\/ Note: Class.self veut dire \"de type Class\"\n            let donn\u00e9es = try! JSONDecoder().decode(Citation.self, from: _data)\n            print(donn\u00e9es)\n            for contenu in donn\u00e9es.resultat {\n                \/\/ Note: ?? est le 'nil-coalescing operator'\n                let auteur = contenu.pensee_auteur ?? \"Erreur: Nom de l'auteur non disponible\"\n                let pens\u00e9e = contenu.pensee_texte  ?? \"Erreur: Pens\u00e9e de l'auteur non disponible\"\n                print (\"\\(auteur) a dit:\\n\\t \\(pens\u00e9e)\\n\\n\")\n            }\n        } \/\/ if let\n    } \/\/ obtenirLaCitationDuJour()\n}<\/pre>\n<h3>\u00a0Note, pour d\u00e9coder vers un tableau:<\/h3>\n<pre class=\"lang:swift decode:true\">let tabeauItems = try! JSONDecoder().decode(Array&lt;Item&gt;.self,\n                                    from: jsonData)<\/pre>\n<p><a name=\"a45\"><\/a><\/p>\n<h3><\/h3>\n<h3>45. Cr\u00e9er un fichier .gitignore pour Xcode<\/h3>\n<pre class=\"lang:swift decode:true \">\u00c0 partir du terminal,\nDans le dossier du projet:\ngit config --global alias.ignore '!gi() { curl -L -s https:\/\/www.gitignore.io\/api\/$@ ;}; gi'\ngit ignore swift,macos &gt;.gitignore\ngit add .gitignore\ngit commit -m \"Ajout du fichier .gitignore\"<\/pre>\n<p>&nbsp;<br \/>\n<a name=\"a46\"><\/a><\/p>\n<h3>46.\u00a0Exemple d&rsquo;utilisation de l&rsquo;API de RiotGame (LeagueOfLegends)<\/h3>\n<p><a href=\"https:\/\/github.com\/ve2cuy\/APIRiotGame-LeagueOfLegends\">https:\/\/github.com\/ve2cuy\/APIRiotGame-LeagueOfLegends<\/a><br \/>\n&nbsp;<\/p>\n<h3>47. Introduction \u00e0 Realm<\/h3>\n<p><a href=\"https:\/\/realm.io\/docs\/tutorials\/realmtasks\/\">Site de Realm<\/a><\/p>\n<h3><\/h3>\n<h3>48.\u00a0Exemple de gestion d&rsquo;une liste de favoris utilisant Realm<\/h3>\n<p><a href=\"https:\/\/github.com\/ve2cuy\/LesAmiesDeLaScienceAvecFavoris\">https:\/\/github.com\/ve2cuy\/LesAmiesDeLaScienceAvecFavoris<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Contenu Afficher une trace\u00a0et comment d\u00e9sactiver les msg du syst\u00e8me Cha\u00eene de caract\u00e8res Cha\u00eene de caract\u00e8res avec interpolation Cha\u00eene &#8211; concat\u00e9nation Cr\u00e9er un tableau \u00e0 partir d&rsquo;un fichier de propri\u00e9t\u00e9s Charger une image par programmation Cacher la barre d&rsquo;\u00e9tat (haut de l&rsquo;\u00e9cran) Lire la s\u00e9lection d&rsquo;un UISegmentedControl Libre Revenir \u00e0 la sc\u00e8ne pr\u00e9c\u00e9dente UITableView &#8211; [&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-2767","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/ve2cuy.com\/xcode\/wp-json\/wp\/v2\/pages\/2767","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=2767"}],"version-history":[{"count":0,"href":"https:\/\/ve2cuy.com\/xcode\/wp-json\/wp\/v2\/pages\/2767\/revisions"}],"wp:attachment":[{"href":"https:\/\/ve2cuy.com\/xcode\/wp-json\/wp\/v2\/media?parent=2767"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}