Aller au contenu


Photo

Xcode 9 Swift 4 - 'init(_: NSNumber)' is deprecated pour Double


  • Please log in to reply
15 réponses à ce sujet

#1 macphi

macphi

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 43 messages

Posté 28 juin 2017 - 10:23

Bonjour à tous

 

J'ai des warnings un peu partout dans Xcode 9 lorsque je compile mon app.

 

Voici un exemple :

self.altitudeEnMetres = Double(data!.relativeAltitude) 'init' is deprecated

Ca vous dit quelque chose ?

 

Merci

 



#2 Insou

Insou

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 226 messages

Posté 28 juin 2017 - 10:34

Regarde de ce coté là :  https://stackoverflo...-swift4-convert



#3 macphi

macphi

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 43 messages

Posté 28 juin 2017 - 11:11

merci, j'ai utilisé cela : 

self.altitudeEnMetres = (data!.relativeAltitude).doubleValue

j'aimerais bien comprendre pourquoi ce changement ?



#4 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 887 messages
  • LocationPlestin-les-Grèves (22)

Posté 28 juin 2017 - 11:43

Ce n'est pas init() globalement qui est deprecated, c'est seulement la version sans nom de paramètre qui est deprecated pour Double pour le type (NSNumber ?) que tu passes comme paramètre.

 

Si relativeAltitude est un NSNumber, il faut :

self.altitudeEnMetres = Double(exactly: data!.relativeAltitude)

Mais n'oublies pas que cet variant renvoie un Double? (optionnel).

 

N'importe comment tu te débrouilles sur l'init, tu devrais éviter d'utiliser le '!' comme ça.

 

Tu es sûr que data ne peux jamais être à nil ?



#5 macphi

macphi

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 43 messages

Posté 28 juin 2017 - 13:11

Effectivement je risque de tuer un poney...

;-)

 

Voici l'ensemble du code :

if CMAltimeter.isRelativeAltitudeAvailable() {
            altimeter.startRelativeAltitudeUpdates(to: OperationQueue.main, withHandler: { data, error in
                if !(error != nil) 
                    self.altitudeEnMetres = (data!.relativeAltitude).doubleValue
self.altitudeEnMetres = Double(exactly: data!.relativeAltitude)
                    self.altitudeEnPied = self.altitudeEnMetres * 3.28084
                    self.relativeAltitude.text = String(format:"%.2f ft", self.altitudeEnPied) + " / " + String(format:"%.2f m", self.altitudeEnMetres)
                    self.pressionEnHPA = (data!.pressure).doubleValue
                    self.pressionEnHPA = self.pressionEnHPA * 10
                    self.pressionHELLO = Double(self.pressionEnHPA * 0.750062)
                    self.pressionMM = String(format:"%.2f mm", self.pressionHELLO)
                    self.pressure2.text = String(format:"%.2f hPa", self.pressionEnHPA) + " - " + self.pressionMM
                }
            })
        }

Je me suis dit que le "if CMAltimeter.isRelativeAltitudeAvailable()" pouvais me préserver d'un data à nil non ?

Ou alors je fais du if let ?

 

Je suis preneur, comme amateur, de tous les conseils...


  • Joanna Carter aime ceci

#6 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 887 messages
  • LocationPlestin-les-Grèves (22)

Posté 28 juin 2017 - 14:01

Effectivement je risque de tuer un poney...

;-)

 

Voici l'ensemble du code :

if CMAltimeter.isRelativeAltitudeAvailable() {
            altimeter.startRelativeAltitudeUpdates(to: OperationQueue.main, withHandler: { data, error in
                if !(error != nil) 
                    self.altitudeEnMetres = (data!.relativeAltitude).doubleValue
self.altitudeEnMetres = Double(exactly: data!.relativeAltitude)
                    self.altitudeEnPied = self.altitudeEnMetres * 3.28084
                    self.relativeAltitude.text = String(format:"%.2f ft", self.altitudeEnPied) + " / " + String(format:"%.2f m", self.altitudeEnMetres)
                    self.pressionEnHPA = (data!.pressure).doubleValue
                    self.pressionEnHPA = self.pressionEnHPA * 10
                    self.pressionHELLO = Double(self.pressionEnHPA * 0.750062)
                    self.pressionMM = String(format:"%.2f mm", self.pressionHELLO)
                    self.pressure2.text = String(format:"%.2f hPa", self.pressionEnHPA) + " - " + self.pressionMM
                }
            })
        }

Je me suis dit que le "if CMAltimeter.isRelativeAltitudeAvailable()" pouvais me préserver d'un data à nil non ?

 

Bah non !  ::)  Si tu regardes les paramètres du closure, tu verrais que data et error sont tous les deux optionnels.

  let altimeter = CMAltimeter()
  
  var altitudeEnMetres: Double = 0.0
  
  var altitudeEnPied: Double
  {
    return altitudeEnMetres * 3.28084
  }
  
  var pressionEnHpa: Double = 0.0
  
  var pressionEnMm: Double
  {
    return pressionEnHpa * 0.750062
  }
  
  @IBOutlet weak var relativeAltitudeLabel: UILabel!
  
  @IBOutlet weak var pressionMmLabel: UILabel!
  
  @IBOutlet weak var pressionHpaLabel: UILabel!

...

    if CMAltimeter.isRelativeAltitudeAvailable()
    {
      altimeter.startRelativeAltitudeUpdates(to: .main, withHandler:
      {
        [unowned self] (data: CMAltitudeData?, error: Error?) in
        
        if error != nil
        {
          // afficher un message pour l'erreur
          
          return
        }
        
        guard let data = data else
        {
          return
        }
        
        self.altitudeEnMetres = data.relativeAltitude.doubleValue
        
        self.relativeAltitudeLabel.text = String(format: "%.2 ft / %.2 m", self.altitudeEnPied, self.altitudeEnMetres)
        
        self.pressionEnHpa = data.pressure.doubleValue * 10
        
        self.pressionMmLabel.text = String(format: "%.2f hPa - %.2f mm", self.pressionEnHpa, self.pressionEnMm)
      })
    }

  • macphi aime ceci

#7 macphi

macphi

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 43 messages

Posté 28 juin 2017 - 14:40

Merci pour la leçon de code !

 

Du coup en prenant modèle son ton code, j'ai quelques autres modifications à faire ailleurs...

 

:prie!:  :bravo!:



#8 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 599 messages
  • LocationParis

Posté 28 juin 2017 - 15:57

[unowned self] (data: CMAltitudeData?, error: Error?) in

Euh, c’est vraiment la bonne syntaxe, nounours ?


Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#9 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 887 messages
  • LocationPlestin-les-Grèves (22)

Posté 28 juin 2017 - 16:05

C'est une des bonnes

#10 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 599 messages
  • LocationParis

Posté 28 juin 2017 - 16:10

On peut mélanger une formulation Objective-C avec du Swift  ?


Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#11 Céroce

Céroce

    Mouleur de chocolats

  • Contrôleur d'arômes
  • 5 206 messages
  • LocationSaint-Leu-d'Esserent / France

Posté 28 juin 2017 - 16:32

On peut mélanger une formulation Objective-C avec du Swift  ?


Ce n'est pas une formulation Objective-C, c'est une "Capture List". Les crochets indiquent les attributs des paramètres de la closure. Par exemple, il est courant d'utiliser [weak self].
Voir https://developer.ap...4097-CH32-ID544
RenaudPradenc.com Je suis développeur iOS & Mac indépendant.

#12 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 599 messages
  • LocationParis

Posté 28 juin 2017 - 16:50

Oki. Merci. J’ignorais. A chaque jour sa petite pierre de connaissance !


Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#13 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 887 messages
  • LocationPlestin-les-Grèves (22)

Posté 28 juin 2017 - 18:41

En utilisant :

[unowned self] (data: CMAltitudeData?, error: Error?) in

J'ai déclaré que je veux "capter" self en évitant de faire une référence circulaire.

 

Normalement, on utilise 'unowned' pour self ou 'weak' pour les vars externes ; mais il faut lire les docs pour mieux déterminer lequel.

 

Et, avec ce code ci-dessus, j'ai déclaré explicitement les types des paramètres pour les montrer à macphi.

 

Il n'est pas obligatoire de déclarer les types si on les connais bien et, dans ce cas là, on peut oublier les parentheses :

[unowned self] data, error in

Et, si on voulait avoir l'air ultra-cool (et confondre ses collègues au même temps, on peut faire :

      altimeter.startRelativeAltitudeUpdates(to: .main, withHandler:
      {
        [unowned self] in
        
        if $1 != nil
        {
          // afficher un message pour l'erreur
          
          return
        }
        
        guard let data = $0 else
        {
          return
        }
        
        …

::)  8--)  >:D



#14 Eric P.

Eric P.

    Torréfacteur de fèves

  • Artisan chocolatier
  • PipPipPipPipPip
  • 717 messages
  • LocationTours

Posté 28 juin 2017 - 20:02

Et, si on voulait avoir l'air ultra-cool (et confondre ses collègues au même temps, on peut faire :

      altimeter.startRelativeAltitudeUpdates(to: .main, withHandler:
      {
        [unowned self] in
        
        if $1 != nil
        {
          // afficher un message pour l'erreur
          
          return
        }
        
        guard let data = $0 else
        {
          return
        }
        
        …

::)  8--)  >:D

La première version est nettement plus lisible...



#15 macphi

macphi

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 43 messages

Posté 29 juin 2017 - 08:55

Je confirme !

::)

 

La première version est nettement plus lisible...



#16 mbritto

mbritto

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 21 messages

Posté 06 juillet 2017 - 09:50

La première version est nettement plus lisible...

Même avis, je ne suis vraiment pas fan de l'utilisation des variables $0, $1, etc. dans les closures. Ce qu'on économise en nombre de caractères, on le perd en lisibilité :)


Créateur et formateur à Purple Giraffe 

 

Blog de Purple Giraffe : http://www.purplegiraffe.fr/blog

 

Mes cours iOS 11 et Swift 4 en français :

 - Cours gratuit d'initiation à la programmation iOS en Swift : http://www.purplegiraffe.fr/p/ios-11-et-swift-4-decouverte

 - Cours complet avec coaching : http://www.purplegiraffe.fr/p/ios-11-et-swift-4-le-cours-complet





0 utilisateur(s) li(sen)t ce sujet

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)