Les copier/coller – Swift3+4

Contenu

  1. Afficher une trace et comment désactiver les msg du système
  2. Chaîne de caractères
  3. Chaîne de caractères avec interpolation
  4. Chaîne – concaténation
  5. Créer un tableau à partir d’un fichier de propriétés
  6. Charger une image par programmation
  7. Cacher la barre d’état (haut de l’écran)
  8. Lire la sélection d’un UISegmentedControl
  9. Libre
  10. Revenir à la scène précédente
  11. UITableView – délégation
  12. Afficher une UITableViewCell perso
  13. UICollectionView – délégation
  14. Créer une tableau d’images à partir de fichiers\(i).png et animer
  15. Créer une image à partir d’une URL – Solution bloquante et non bloquante
  16. Créer une tableau à partir d’un résultat JSON via le web
  17. Préparer un segue
  18. Exécuter une méthode après un délai
  19. Programmer un NSTimer
  20. Afficher un Alert
  21. Charger une scène (NIB, XIB, View) par programmation
  22. Animer une propriété
  23. Détecter une collision entre deux UIView
  24. Insérer une ‘View’ dans une ‘View’ parent,  à la position parentViewCount – n
  25. Obtenir l’élément d’un dictionnaire
  26. Array – codé au dur
  27. Array – énumération rapide
  28. Dictionnary – codé au dur
  29. Dictionnary – énumération rapide
  30. Afficher heure actuelle avec format
  31. Créer un UIButton + event par programmation
  32. Capturer l’écran dans un UIImage
  33. Poster vers Facebook
  34. Poster vers twitter
  35. Masquer le clavier
  36. Programmer une délégation (UITextField)
  37. Ajouter la gestion des versions à un projet existant
  38. Stub AppDelegate.swift pour Xcode 6.4
  39. Git à partir du terminal (pour un projet en équipe)
  40. Variables globales
  41. Permettre la lecture d’une URL (à partir de Xcode 8)
  42. Jouer un stream vidéo à partir d’une URL
  43. Jouer un stream audio à partir d’une URL
  44. Conversion swift 4 de données JSON
  45. Créer un fichier .gitignore pour Xcode
  46. Exemple d’utilisation de l’API de RiotGame (données sans Array)
  47. Introduction à Realm
  48. Exemple de gestion d’une liste de favoris utilisant Realm
  49.  Prendre une pause

 


 

1. Afficher une trace

print("#Bonjour le monde...\n")
let pi = 3.141592
print("#La valeur de pi est \(pi)\n")
let a=3, b=7
print("#\(a) + \(b) = \(a+b)\n")
let unNom = "TIM le magnifique"
print("#\(unNom) dit: Bonjour ");print("à tous!\n")


Note: voici comment désactiver les messages superflus de la        console:
Dans Product>>Scheme>>Edit Scheme…>>Run…Arguments,
Ajouter cette variable d’environment:
Name: OS_ACTIVITY_MODE, Value: disable

2. Chaîne de caractères

let uneChaineRO = "Je suis une chaine en lecture seule"
var uneChaineRW = "Je suis une chaine en lecture écriture"
var uneChaineOC:NSString = "Je suis une chaine Objective-C"
print("Il y a \(countElements(uneChaineRO)) caractères dans uneChaineRO")
print("Il y a \(String(uneChaineOC.length)) caractères dans uneChaineOC")



3. Chaîne de caractères avec interpolation

let perso = "Fantomas"
let persoForce = 17
var message = "Mon nom est \(perso) et j'ai \(persoForce) de force."



4. Chaîne – concaténation

var msg:String
let pi = 3.141592
msg = "Bienvenue " + "Au cours d'intro "
msg += "du langage Swift. PI = " + String(pi)
var res = ""
for car in msg {
    res += car
}



5. Créer un tableau avec un fichier

// Étant donné le fichier suivant:
<array>
  <dict>
    <key>nom</key>
    <string>Paul</string>
    <key>photo</key>
    <string>image01.png</string>
    <key>dette</key>
    <real>10.99</real>
  </dict>
...
</array>
// Créer un tableau avec méthode: Swift + Foundation
let pathFichierPlist = NSBundle.mainBundle().pathForResource("liste des amis", ofType: "plist")!
amis = NSArray(contentsOfFile: pathFichierPlist)
/// Méthode 100% swift (pas encore au point en version beta)
var tabloPerso:String[] = []
let path = NSBundle.mainBundle().pathForResource("personnages", ofType: "plist")
tabloPerso = NSArray(contentsOfFile: path) as String[]
print(tabloPerso)
tabloPerso.append("Tintin")
print(tabloPerso)
print(tabloPerso[tabloPerso.count - 1])
// Créer un tableau de 'Dictionary' à partir d'un fichier plist
// Définition du tableau
var amis:[Dictionary<String,String>]!
...
// Affectation à partir d'un fichier
amis = NSArray(contentsOfFile: NSBundle.mainBundle().pathForResource("liste des amis", ofType: "plist")!) as [Dictionary<String,String>]



6. Charger une image par programmation

let _image = UIImage(named:"paysage")
self.uneImage.image = image
// ou bien
self.imageView.image = UIImage(named:"image.png")


7. Cacher la barre d’état (haut de l’écran)

    override func prefersStatusBarHidden() -> Bool {
        return true
    }



8. Lire la sélection d’un UISegmentedControl

let selection =(sender as UISegmentedControl).selectedSegmentIndex



9. Libre


10. Revenir à la scène précédente

@IBAction func retourParent(sender: AnyObject) {
   self.dismissViewControllerAnimated(true, completion:nil);
}



11. UITableView – délégation

// ********************************************************************
func tableView(tableView: UITableView,  numberOfRowsInSection:NSInteger) -> Int
// ********************************************************************
{
   return tablo.count
} // numberOfRowsInSection
// ********************************************************************
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell!
// ********************************************************************
{
  //variable type is inferred
  var cell = tableView.dequeueReusableCellWithIdentifier("CELL") as? UITableViewCell
  if !cell {
     cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "modeleCellule")
 } // !cell
  //we know that cell is not empty now so we use ! to force unwrapping
  cell!.textLabel.text = tablo[indexPath.row]
  cell!.detailTextLabel.text = "Personnage de Tintin"
  cell!.imageView.image = UIImage(named:"lezard")
  return cell
} // cellForRowAtIndexPath



12. Afficher une UITableViewCell perso

// ********************************************************************
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell!
// ********************************************************************
{
  //Le type de la variable est inféré.
  var cell = tableView.dequeueReusableCellWithIdentifier("modeleCellule") as? CellulePerso
  if cell !=nil {  // Si nil alors
      cell = CellulePerso(style: UITableViewCellStyle.Value1, reuseIdentifier: "modeleCellule")
  } // !cell
  //À ce point ci, cell n'est pas nil. Il faut utiliser ! pour la déballer
  cell!.c1.text = tablo[indexPath.row]
  cell!.c2.text = "Personnage de Tintin"
  cell!.uneImage.image = UIImage(named:"lezard")
  return cell
} // cellForRowAtIndexPath

cc-cellule.perso.03
cc-cellule.perso.01
cc-cellule.perso.02

13. UICollectionView – délégation

// ********************************************************************
func collectionView(collectionView: UICollectionView?, numberOfItemsInSection section: Int) -> Int
// ********************************************************************
{
   return tablo.count
}
// ********************************************************************
func collectionView(collectionView: UICollectionView?, cellForItemAtIndexPath indexPath: NSIndexPath?) -> UICollectionViewCell?
// ********************************************************************
{
  let cell = collectionView?.dequeueReusableCellWithReuseIdentifier("uneCellule", forIndexPath: indexPath) as CellulePersoCV
  // Configuration de la cellule
  cell.c1.text = String(itemCourant)
  cell.c2.text = String(indexPath!.row)
  cell.c3.text = tablo[indexPath!.row]
  return cell
}

 

 14. Créer une tableau d’images à partir de fichiers000(i).png et animer

let DUREE_ANIMATION = 1 as NSTimeInterval
let ANIMATION_NB_FOIS = 3
var tabloImages = UIImage[]()
for i in 1...28 {
  tabloImages.append(UIImage(named:"warrior_walk_\(i).png"))
}
// Renseigner l'image à partir du tableau et démarrer l'animation
uneImageAnimee.animationImages = tabloImages
uneImageAnimee.animationRepeatCount = ANIMATION_NB_FOIS
uneImageAnimee.animationDuration = DUREE_ANIMATION
uneImageAnimee.startAnimating()

 

 15. Créer une image à partir d’une URL

// Créer un UIImage à partir du WEB
// Solution bloquante
// ** Solution 1: Forme courte
let uneURL:NSURL = NSURL(string:"http://hmp.me/dtm")
uneImageURL.image = UIImage(data:NSData(contentsOfURL:uneURL));
// ** Solution 2: Forme longue avec validation
let uneURL:NSURL = NSURL(string:"http://hmp.me/dtm")
var err:NSError?
let htmlData = NSData.dataWithContentsOfURL(uneURL, options: NSDataReadingOptions.DataReadingMappedIfSafe, error: &err)
uneImageURL.image = UIImage(data:htmlData)
// ** Solution 3 - non bloquante
let uneURL:NSURL = NSURL(string:"http://hmp.me/dtm")
let request:NSURLRequest = NSURLRequest(URL:uneURL)
let queue:NSOperationQueue = NSOperationQueue()
NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
           self.uneImageURL.image = UIImage(data:data)
       })

 

 16. Créer une tableau à partir d’un résultat JSON via le web

// Obtenir la météo de Montréal via l'API Yahoo
let urlString = "http://query.yahooapis.com/v1/public/yql?q=select%20item%20from%20weather.forecast%20where%20location%3D%22CAXX0301%22&format=json"
let request:NSURLRequest = NSURLRequest(URL:NSURL(string: urlString))
let queue:NSOperationQueue = NSOperationQueue()
NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
  var err: NSError?
  var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSDictionary
  if(err?) {
     // Si erreur de conversion JSON alors afficher l'erreur
     print("JSON Error (err!.localizedDescription)")
  }
  print("===> résultat JSON:\n\n \(jsonResult)")
})

 

 17. Préparer un segue

// Lancée automatiquement avant une transition 'segue'
// -------------------------------------------------------------
// Exemple pour une sélection à partir d'un UITableView
// ********************************************************************
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!)
// ********************************************************************
{
  // Pointer sur la scène de destination
  let sceneDestination = segue.destinationViewController as ClasseSceneDestination
  // sender -> pointe sur la cellule sélectionnée
  let selectionCourante = self.unTableView.indexPathForCell(sender as UITableViewCell).row;
  // Envoyer les informations à la scène de destination
  sceneDestination.tablo = tablo
  sceneDestination.itemCourant = selectionCourante
}  // prepareForSegue
// -------------------------------------------------------------
// Exemple pour une sélection à partir d'un UICollectionView
var _selection = 0
// ********************************************************************
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!)
// ********************************************************************
{
  // Pointer sur la scène de destination
  let sceneDestination = segue.destinationViewController as Scene03
  // indice cellule sélectionnée via shouldSelectItemAtIndexPath
  let selectionCourante =  _selection;
  // Envoyer les informations de la sélection courante
  sceneDestination.title = tablo[selectionCourante]
}
// ********************************************************************
func collectionView(collectionView: UICollectionView?, shouldSelectItemAtIndexPath indexPath: NSIndexPath?) -> Bool
// ********************************************************************
{
  _selection = indexPath!.row
return true
}

 

 18. Exécuter une méthode après un délai

DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
                self.tournerLaPage("page2")
            }
// ****************************************************
func tournerLaPage(scene:String) {
        print("Tourner la page à \(scene)")
        performSegueWithIdentifier(scene, sender: self)
}

 

19.  Programmer un NSTimer

override func viewDidLoad() {
   super.viewDidLoad()
   Timer.scheduledTimer(timeInterval: 2, target: self, selector: #selector(Intro.passerAuMenuPrincipal), userInfo: nil, repeats: false)
} // viewDidLoad()
func passerAuMenuPrincipal(){
   performSegue(withIdentifier: "versMenuPrincipal", sender: self)
} // passerAuMenuPrincipal

 

 20. Afficher un Alert

// Nouvelle méthode proposée avec Swift
let alert = UIAlertController(title: "Title", message: "Message", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Button", style: UIAlertActionStyle.default, handler: nil))
// Patch temporaire pour Xcode 8b5; utilisation de 'DispatchQueue' pour exécuter le self.present()
DispatchQueue.main.async( execute: { self.present(alert,  animated: true, completion: nil) } )
// Ancien méthode inspirée d'Objective-C
var alert2 = UIAlertView()
alert2.title = "Un titre"
alert2.message = "Un message"
alert2.addButtonWithTitle("ok")
alert2.show()

 

 21. Charger un NIB par programmation

var uneView = UINib(nibName: "Magazine01", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as UIView
// Pour ajouter à la scène courante:
view.addSubview(uneView);

 

 22. Animer une propriété

animerImage(self.uneImage)
// ****************************************
func animerObjet (objet:UIView){
   UIView.animateWithDuration(
             2,
             animations: { objet.alpha = 0.5 },
             completion: { finished in
                           objet.hidden = false }
   ) // UIView
   UIView.animateWithDuration(
             1,
             delay:1,
             options:UIViewAnimationOptions.CurveEaseIn,
             animations: { objet.center.x = objet.center.x + 50},
             completion: { _ in
                           // Code à exécuter lorsque animation terminée
                           // Par exemple, une autre animation.
                         }
    ) // UIView
}  // animerImage

 
 

 23. Détecter une collision entre deux UIView

CGRect personnage = [[lePersonnage.layer presentationLayer]frame];
CGRect sousZone = CGRectInset(personnage, personnage.size.width/2,personnage.size.height/2 );
if (CGRectIntersectsRect(sousZone, unObjet.frame))
{
  NSLog(@"Il y a eu collision entre le personnage et %@", unObjet.class);
}

 

24. Insérer une subView à la position parentViewCount – n

view.insertSubview(uneView, atIndex: view.subviews.count - 1)

 

25. Obtenir l’élément d’un dictionnaire

if let tt = jsonResult["query"]!["results"]!["channel"]!["item"]!["condition"]!["temp"]! as String!
{
   print("Température actuelle pour Montréal: \(tt)")
}

 

26. NSArray – créer au dur

var tablo = ["Bob", "Binne", "Tintin", "Milou", "Hadock", "Castafiore", "Allan", "Tounesol", "Alcazar", "Barnabé", "Baxter", "Bill","Bohlwinkel", "Cipaçalouvishni"]
// Pour ajouter un élément
tablo.append("Objectif Lune")
// Ou
tablo+="encore"
// Pour un NSArray
var tabloNSArray:NSMutableArray = ["Tintin", "et", "Milou"]
tabloNSArray.addObject("Coke en stock")

 

27. NSArray – énumération rapide

// Énumération des éléments d'un tableau
for item in tablo) {
    print("Item: \(item)")
}
// Énumération des éléments d'un tableau avec indice
for (index, value) in enumerate(tablo) {
    print("Item \(index + 1): \(value)")
}

 

28. NSDictionnary – créer au dur

var dictio = ["Nom":"Paul", "Age":22, "Titre":"Intégrateur", "Expérience":2]
// Ajouter un élément
dictio["Compagnie"] = "TIM"
var dictio2:NSDictionary = ["Nom":"Paul", "Age":22, "Titre":"Intégrateur", "Expérience":2]

 

29. NSDictionnary – énumération rapide

//Pour parcourir les éléments d'un dictionnaire
for(NSString * key in unDictionnaire){
   NSLog(@"clé: %@, contenu: %@", key, unDictionnaire[key]);
}

 

30. Afficher heure actuelle avec format

// ******************************************
func obtenirHeure() -> String {
  let unFormateurDeDate = NSDateFormatter()
  unFormateurDeDate.dateFormat = "'Nous sommes 'EEEE' et il est 'hh:mm:ss";
  unFormateurDeDate.locale = NSLocale(localeIdentifier: "en_US_POSIX")
  return unFormateurDeDate.stringFromDate(NSDate())
}  // obtenirHeure
print(obtenirHeure())
// Ou en ajoutant une nouvelle méthode à la Classe NSDate
extension NSDate
{
    convenience
      init(dateString:String) {
      let dateStringFormatter = NSDateFormatter()
      dateStringFormatter.dateFormat = "yyyy-MM-dd"
      dateStringFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
      let d = dateStringFormatter.dateFromString(dateString)
      self.init(timeInterval:0, sinceDate:d)
    }
 }

 

31. Créer un UIButton + event par programmation

// ********************************************************
func creerBouton(texte:String, action:String) -> UIButton {
  let unBouton   = UIButton.buttonWithType(UIButtonType.System) as UIButton
  unBouton.frame = CGRectMake(100, 100, 100, 50)
  unBouton.backgroundColor = UIColor(red: 45/255, green: 23/255, blue: 111/255, alpha: 1.0)
  unBouton.setTitle(texte, forState: UIControlState.Normal)
  unBouton.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Normal)
  unBouton.addTarget(self, action: Selector(action), forControlEvents: UIControlEvents.TouchUpInside)
  return unBouton
} // creerBouton
// ********************************************************
func boutonAction(sender:UIButton!)
{
  print("Action du bouton maison!")
}
// Utilisation
self.view.addSubview(creerBouton("Victoire!", action: "boutonAction:"))

32. Copier l’écran dans un UIImage

var imageFinale = UIImage()
    func sauvegarderEcran(){
        // Description : méthode servant à capturer l’écran et au besoin,
        // en faire une sauvegarde dans l’album photos.
        // Cacher le menu
        leMenu!.isHidden = true
        // 1 - Préparer un contexte de dessin à partir de la taille de la scène
        UIGraphicsBeginImageContext(self.view.bounds.size);
        // 2 – Dessiner à partir du claque par défaut de la scène
        self.view.layer.render(in: UIGraphicsGetCurrentContext()!);
        // 3 – Stocker le résultat dans notre objet local
        imageFinale = UIGraphicsGetImageFromCurrentImageContext()!;
        // 5 – Fermer le contexte de dessin
        UIGraphicsEndImageContext();
        // 6 – Facultatif - Stocker une copie de la capture d’écran dans l’album photos
        // Note:  À partir de iOS 10: Info.plist doit contenir une clé 'NSPhotoLibraryUsageDescription' de type 'String' qui indique à l'utilisateur comment sera utilisé sa librairie de photos.
        UIImageWriteToSavedPhotosAlbum(imageFinale, nil, nil, nil );
        leMenu!.isHidden = false
    } // sauvegarderEcran

33. Poster vers Facebook

import Social
    func posterSurFacebook() {
        // Les étapes pour utiliser ‘facebook’
        // 1 - Tester si le service et les informations de connexion sont dispo
        if SLComposeViewController.isAvailable(forServiceType: SLServiceTypeFacebook)
        {
            // 2 - Créer un feuille pour le 'post'
            if let controleur = SLComposeViewController (forServiceType: SLServiceTypeFacebook) {
                // 3 - Composer le message
                controleur.setInitialText("Test avec Swift et Xcode");
                self.present(controleur, animated: true, completion: nil);
                // 4 - Ajouter une image - facultatif
                controleur.add(imageFinale);
                // 5 - Ajouter un lien - facultatif
                controleur.add(NSURL(fileURLWithPath: "http://tim.cstj.qc.ca") as URL!);
                // 6 - Présenter la fenêtre de confirmation à l'utilisateur
                // self.present(controleur, animated: true, completion: nil);  // Ne fonctionne pas pour fb sous Xcode 8B5
                // Par contre, fonctionne pour twitter.
                // Temporairement utiliser:
                self.navigationController?.pushViewController(controleur, animated: true)
            }
        } // if Facebook
    } // posterSurFacebook

 

34. Poster vers twitter

import Social
    func posterSurTwitter() {
        // Les étapes pour utiliser ‘twitter’
        // 1 - Tester si le service et les informations de connexion sont dispo
        // let sl = SLComposeViewController(for)
        if SLComposeViewController.isAvailable(forServiceType: SLServiceTypeTwitter)
        {
            // 2 - Créer un feuille pour le 'post'
            if let tweetSheet = SLComposeViewController (forServiceType: SLServiceTypeTwitter) {
                // 3 - Composer le message
                tweetSheet.setInitialText("CSTJ.TIM - Production sur support 2017. Introduction à Xcode 9 #CSTJ");
                // 4 - Ajouter une image - facultatif
                tweetSheet.add(imageFinale);
                // 5 - Ajouter un lien - facultatif
                //tweetSheet.add(NSURL(File:"http://tim.cstj.qc.ca"));
                // 6 - Présenter la fenêtre de confirmation à l'utilisateur
                self.present(tweetSheet, animated: true, completion: nil);
            }
        } // if twitter disponible ...
    } // posterSurTwitter

35. Masquer le clavier

// Note: il faut aussi renseigner le 'delegate' de l'objet
func textFieldShouldReturn(textField:UITextField!) -> Bool{
  textField.resignFirstResponder()
  return true
}

36. Programmer une délégation (UITextField)

import UIKit
class ViewController: UIViewController, UITextFieldDelegate  {
    @IBOutlet weak var unChamp: UITextField!
    var nbRetours = 0
    override func viewDidLoad() {
        super.viewDidLoad()
        unChamp.delegate = self
    }  // viewDidLoad
    /// Programmer une délégation
    func textFieldShouldReturn(textField: UITextField!) -> Bool  {
        print("La touche 'Return' a été appuyée \(++nbRetours) fois.")
        return true
    } //textFieldShouldReturn
}  // ViewController

 

37. Ajouter la gestion des versions à un projet existant

# À partir de l'app 'terminal', naviguer vers le dossier parent du projet et saisir les commandes suivantes:
git init
git add .
git commit -m "Premier 'Commit'"

38. Stub AppDelegate.swift pour Xcode 6.4

//  AppDelegate.swift
//  stub
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        return true
    } // didFinishLaunchingWithOptions
    func applicationWillResignActive(application: UIApplication)    {  }
    func applicationDidEnterBackground(application: UIApplication)  {  }
    func applicationWillEnterForeground(application: UIApplication) {  }
    func applicationDidBecomeActive(application: UIApplication)     {  }
    func applicationWillTerminate(application: UIApplication)       {  }
} // class AppDelegate:

39. Git à partir du terminal (pour le travail d’équipe)

Étapes:
1 - Creer un 'repo' sur github avec un Readme et ignore 'swift'
2 - Creer le projet sous Xcode avec l'option 'git'
3 - Avec terminal, cd vers le dossier du projet taper:
  git init
  git remote add origin https://github.com/votre compte/le projet.git
  git pull origin master
  git add *
  git commit -m "commit de depart"
4 - dand Xcode, faire un push
// Pour le deuxieme membre de l'équipe faire:
Source control -> check out
// gestion des conflits
Automatically resolving git merge conflicts in Xcode’s project.pbxproj file
// Pousser les 'tags' vers le remote: git push origin --tags

40. Variables globales

Ajouter une classe ou une structure au projet qui contient des propriétés statiques:

// Fichier Static.swift
struct Static {
    static var i = 99
}
///  Exemple d'utilisation:
override func viewDidAppear(animated: Bool) {
    Static.i = 123
    print(Static.i)
}

41. Permettre la lecture d’une URL (à partir de Xcode 8)

Dans le cas du message d’erreur suivante, suite à la lecture de contenu à partir d’une URL externe,

App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app’s Info.plist file.

Il faut ajouter la clé suivante dans le fichier info.plist de votre projet;

<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>

42. Jouer un stream vidéo à partir d’une URL

//  Exemple d'un vidéo stream à partir d'une URL
//  Created by Alain on 16-11-25.
import UIKit
import MediaPlayer
import AVKit
class ViewController: UIViewController {
    override func viewDidLoad() {
    let url = URL(string: "http://jplayer.org/video/m4v/Big_Buck_Bunny_Trailer.m4v")!
    // Note, si la vidéo est locale, il faut construire l'URL ainsi:
    // let url = Bundle.main.url(forResource: "piano", withExtension: "m4v")!
    let player = AVPlayer(url: url)
    let playerViewController = AVPlayerViewController()
    playerViewController.player = player
    playerViewController.view.frame = CGRect(x: 0, y: 0, width: 640, height: 480)
    // Ou bien ceci pour ajuster la vidéo à sa view
    playerViewController.view.frame = uneViewServantAAfficherLaVideo.bounds
    self.view.addSubview(playerViewController.view)
    // Facultatif, Ajouter le panneau de control de la vidéo
    self.addChildViewController(playerViewController)
    player.play()
 } // viewDidLoad
} // ViewController
/// **************************************************
/// Ou bien à partir d'un AVPlayerViewControler
/// Note: La vidéo occupera 100% de l'espace de la vue
import UIKit
import MediaPlayer
import AVKit
class MyPlayer: AVPlayerViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let url = URL(string: "http://jplayer.org/video/m4v/Big_Buck_Bunny_Trailer.m4v")!
        self.player = AVPlayer(url: url) //player
        self.player?.play()
    } // viewDidLoad
} // MyPlayer

Il y a un exemple complet ici

43. Jouer un stream audio à partir d’une URL

Sur GitHub ici

44. Conversion swift 4 de données JSON

Étant donné l’URL: http://prof-tim.cstj.qc.ca/cours/xcode/sources/apitim.php?mode=rnd&quant=5&format=json
Étant donné les classes suivantes:

struct YahooFinance: Codable {
    var query: Query
}
struct Query:Codable {
    var count:      Int
    var created:    String
    var lang:       String
    var results:    Results
}
struct Results:Codable {
    var quote: Array<Quote>
}
struct Quote:Codable {
    var Symbol: String
    var Ask:    Float?
}

Chargement des données:

extension ViewController {
    //MARK:- Obtenir les données
    // =======================================================
    func obtenirLaCitationDuJour(){
       let uneURL = "http://prof-tim.cstj.qc.ca/cours/xcode/sources/apitim.php?mode=rnd&quant=5&format=json"
        if let _data = NSData(contentsOf: URL(string: uneURL)!) as Data? {
            // Note: Class.self veut dire "de type Class"
            let données = try! JSONDecoder().decode(Citation.self, from: _data)
            print(données)
            for contenu in données.resultat {
                // Note: ?? est le 'nil-coalescing operator'
                let auteur = contenu.pensee_auteur ?? "Erreur: Nom de l'auteur non disponible"
                let pensée = contenu.pensee_texte  ?? "Erreur: Pensée de l'auteur non disponible"
                print ("\(auteur) a dit:\n\t \(pensée)\n\n")
            }
        } // if let
    } // obtenirLaCitationDuJour()
}

 Note, pour décoder vers un tableau:

let tabeauItems = try! JSONDecoder().decode(Array<Item>.self,
                                    from: jsonData)

45. Créer un fichier .gitignore pour Xcode

À partir du terminal,
Dans le dossier du projet:
git config --global alias.ignore '!gi() { curl -L -s https://www.gitignore.io/api/$@ ;}; gi'
git ignore swift,macos >.gitignore
git add .gitignore
git commit -m "Ajout du fichier .gitignore"

 

46. Exemple d’utilisation de l’API de RiotGame (LeagueOfLegends)

https://github.com/ve2cuy/APIRiotGame-LeagueOfLegends
 

47. Introduction à Realm

Site de Realm

48. Exemple de gestion d’une liste de favoris utilisant Realm

https://github.com/ve2cuy/LesAmiesDeLaScienceAvecFavoris