Aller au contenu


Photo

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


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

#1 macphi

macphi

    Cueilleur de cabosses

  • Membre
  • PipPipPip
  • 75 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
  • 238 messages

Posté 28 juin 2017 - 10:34

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



#3 macphi

macphi

    Cueilleur de cabosses

  • Membre
  • PipPipPip
  • 75 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 996 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

    Cueilleur de cabosses

  • Membre
  • PipPipPip
  • 75 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...


  • Draken et Joanna Carter aiment ceci

#6 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 996 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

    Cueilleur de cabosses

  • Membre
  • PipPipPip
  • 75 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 793 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 996 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 793 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 320 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 793 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 996 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


  • macphi aime ceci

#14 Eric P.

Eric P.

    Torréfacteur de fèves

  • Artisan chocolatier
  • PipPipPipPipPip
  • 725 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

    Cueilleur de cabosses

  • Membre
  • PipPipPip
  • 75 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
  • 25 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


#17 macphi

macphi

    Cueilleur de cabosses

  • Membre
  • PipPipPip
  • 75 messages

Posté 12 novembre 2017 - 12:55

Je déterre ce post parce que j'ai bien avancé et je n'ai plus "que" deux warnings qui me donne un peu de fil à retordre :

'substring(from:)' is deprecated: Please use String slicing subscript with a 'partial range from' operator.

Voici la ligne fautive, j'ai besoin d'extraire les 4 chiffres derrière le Q (sans mauvais jeu de mots)

let QNH2 = QNH1.substring( from: QNH1.range(of: "Q", options: .literal, range: nil, locale: nil)?.lowerBound ?? QNH1.startIndex )

Avez-vous une idée de ce que signifie ce message ?

 

Et là vous me direz, t'as demandé à DuckDuckGo ?

Oui mais le problème c'est que lorsque j'ai lu les réponses, je ne comprends plus bien la question que j'ai posée...

 

Et plus généralement connaissez-vous une doc/tuto pour bien gérer les chaines de caractères ?

Je trouve les fonctions complexes même pour des choses simples...

 

Merci



#18 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 793 messages
  • LocationParis

Posté 12 novembre 2017 - 13:13

Apple s’amuse à déprécier des tas de choses en ce moment.

Quand Xcode signale que quelque chose est deprecated, cela veut dire que cela fonctionne encore, mais que cela n’existera plus dans la version suivante de Swift. C’est pour cela qu’il te recommande d’utiliser ‘partial range from’ à la place.

 

A part ça, ton code me pique les yeux avec les variables commençant par des MAJUSCULES ! Les majuscules c’est pour les noms de classes..


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/

 

 


#19 macphi

macphi

    Cueilleur de cabosses

  • Membre
  • PipPipPip
  • 75 messages

Posté 12 novembre 2017 - 13:26

Ton code me pique les yeux avec les variables commençant par des MAJUSCULES !

Faut pas ?



#20 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 793 messages
  • LocationParis

Posté 12 novembre 2017 - 13:28

Faut pas ?

NON ..

La convention de nommage Swift stipule qu’il faut réserver les Majuscules aux noms de classes. Regarde dans la doc Apple, tu ne verras jamais une variable commençant par une majuscule. 

Cela améliore la lisibilité des programmes.


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/

 

 





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

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