Aller au contenu


Photo

from Any? to Any

Any

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

#1 iLandes

iLandes

    Torréfacteur de fèves

  • Membre
  • PipPipPipPipPip
  • 852 messages
  • LocationLandes

Posté 27 janvier 2017 - 09:46

Bonjour,

 

J'ai un warning dans un prochain dont je ne comprends pas la signification :

Expression implicite coerced from Any? to Any

Mon idée est que j'envoie qq chose de type [key: String, value: Any?] dans  un dictionnaire de type [AnyHashable : Any]?

 

Comment mapper mon  [key: String, value: Any?] en  [key: String, value: Any] soit en supprimant les clés qui ont comme valeur nil soit en les retirant du tableau. Je pense qu'une fois les deux types identiques le warning va disparaitre.

 

Cela dit quelque chose à quelqu'un ?


--

seb@stien as iLandes

Linked In, Twitter, GitHub, StackOverFlowiLandes.fr

 

Applications : Plages.TVGirondins33Jardiner avec la luneDVRGVMidi Note Converter, FreeIMC.

 

It's not a bug, it's a feature.

Feature : A bug as described by the marketing department (Apple II Reference Manuel 1979 page 180)

 


#2 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 800 messages
  • LocationParis

Posté 27 janvier 2017 - 10:13

J'ai vu ce message apparaitre avec la dernière version d'XCode, en utilisant print().

import UIKit

class ViewController: UIViewController {
    
    var valeur:Int?

    override func viewDidLoad() {
        super.viewDidLoad()
        
        valeur = 123
        print (valeur)
    }
}

Le print(valeur) affiche le warning :

 

 

Expression implicity coerced from "Int?" to Any

 

Il me propose 3 manières de régler l'avertissement. J'ai pris celle-ci et ça roule :

import UIKit

class ViewController: UIViewController {
    
    var valeur:Int?

    override func viewDidLoad() {
        super.viewDidLoad()
        
        valeur = 123
        print (valeur as Any)
    }
}

Je présume que Xcode est devenu encore plus rigoureux qu'avant sur le contrôle des types de données.


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/

 

 


#3 Joanna Carter

Joanna Carter

    Broyeur de fèves

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

Posté 27 janvier 2017 - 17:12

    let x = [1 : nil, 2 : "fred", 3 : "bert", 4 : nil]
    
    let y = x.flatMap { return $1 != nil ? [$0 : $1!] : nil }


#4 Joanna Carter

Joanna Carter

    Broyeur de fèves

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

Posté 27 janvier 2017 - 17:30

J'ai vu ce message apparaitre avec la dernière version d'XCode, en utilisant print().

import UIKit

class ViewController: UIViewController {
    
    var valeur:Int?

    override func viewDidLoad() {
        super.viewDidLoad()
        
        valeur = 123
        print (valeur)
    }
}

Le print(valeur) affiche le warning :

 

 

Il me propose 3 manières de régler l'avertissement. J'ai pris celle-ci et ça roule :

import UIKit

class ViewController: UIViewController {
    
    var valeur:Int?

    override func viewDidLoad() {
        super.viewDidLoad()
        
        valeur = 123
        print (valeur as Any)
    }
}

Je présume que Xcode est devenu encore plus rigoureux qu'avant sur le contrôle des types de données.

 

Car tu as assigné une valeur juste avant le print(...), tu peux, en toute sécurité, utiliser :

    valeur = 123
    
    print(valeur!)


#5 iLandes

iLandes

    Torréfacteur de fèves

  • Membre
  • PipPipPipPipPip
  • 852 messages
  • LocationLandes

Posté 27 janvier 2017 - 17:44

    let x = [1 : nil, 2 : "fred", 3 : "bert", 4 : nil]
    
    let y = x.flatMap { return $1 != nil ? [$0 : $1!] : nil }

 

Merci Joanna mais plutôt 

let x = [1 : nil, 2 : "fred", 3 : "bert", 4 : nil]
let y = x.flatMap { return $1 != nil ? ($0,$1!) : nil }

Sinon avec les [ on recrée un tableau ;-)


--

seb@stien as iLandes

Linked In, Twitter, GitHub, StackOverFlowiLandes.fr

 

Applications : Plages.TVGirondins33Jardiner avec la luneDVRGVMidi Note Converter, FreeIMC.

 

It's not a bug, it's a feature.

Feature : A bug as described by the marketing department (Apple II Reference Manuel 1979 page 180)

 


#6 iLandes

iLandes

    Torréfacteur de fèves

  • Membre
  • PipPipPipPipPip
  • 852 messages
  • LocationLandes

Posté 27 janvier 2017 - 17:47

Grr non plus là on créé un tableau de turple (int:string!) :[


--

seb@stien as iLandes

Linked In, Twitter, GitHub, StackOverFlowiLandes.fr

 

Applications : Plages.TVGirondins33Jardiner avec la luneDVRGVMidi Note Converter, FreeIMC.

 

It's not a bug, it's a feature.

Feature : A bug as described by the marketing department (Apple II Reference Manuel 1979 page 180)

 


#7 Joanna Carter

Joanna Carter

    Broyeur de fèves

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

Posté 27 janvier 2017 - 17:58

Avec mon code, tu commences avec un tableau de dictionnaires - et, après, tu auras un tableau de dictionnaires.

 

Le [$0 : $1!] est un dictionnaire de [Int : String]

 

Donc, qu'est-ce que tu veux ?



#8 iLandes

iLandes

    Torréfacteur de fèves

  • Membre
  • PipPipPipPipPip
  • 852 messages
  • LocationLandes

Posté 27 janvier 2017 - 18:05


Avec mon code, tu commences avec un tableau de dictionnaires - et, après, tu auras un tableau de dictionnaires.

 

En fait non  ::)

x = [2: Optional("fred"), 3: Optional("bert"), 1: nil, 4: nil]
y = [[2, "fred"], [3, "bert"]]

 je voudrais :

x = [2: Optional("fred"), 3: Optional("bert"), 1: nil, 4: nil]
y = [2: "fred", 3: "bert"]

--

seb@stien as iLandes

Linked In, Twitter, GitHub, StackOverFlowiLandes.fr

 

Applications : Plages.TVGirondins33Jardiner avec la luneDVRGVMidi Note Converter, FreeIMC.

 

It's not a bug, it's a feature.

Feature : A bug as described by the marketing department (Apple II Reference Manuel 1979 page 180)

 


#9 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 800 messages
  • LocationParis

Posté 27 janvier 2017 - 18:13

 

Car tu as assigné une valeur juste avant le print(...), tu peux, en toute sécurité, utiliser :

    valeur = 123
    
    print(valeur!)

Oui je sais, mais j'ai vraiment une aversion pour le !. Je trouve que cela ne fait pas propre dans un code.

 

EDIT : De plus je n'ai pas rencontré le problème avec un Int?. Là c'est juste un exemple simplifié pour montrer l'apparition du warning. En situation réelle cela se produit avec des objets pouvant vraiment être nil.


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/

 

 


#10 Joanna Carter

Joanna Carter

    Broyeur de fèves

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

Posté 27 janvier 2017 - 19:26

OK iLandes, c'est une merveille de programmation fonctionnelle :

    let x = [1 : nil, 2 : "fred", 3 : "bert", 4 : nil]
    
    let y = x.reduce([Int : String](),
    {
      var result = $0
      
      if let value = $1.value
      {
        result[$1.key] = value
      }
      
      return result
    })

:clap:  :clap:  :clap:


  • iLandes aime ceci

#11 iLandes

iLandes

    Torréfacteur de fèves

  • Membre
  • PipPipPipPipPip
  • 852 messages
  • LocationLandes

Posté 28 janvier 2017 - 11:25

Merci Joanna ;-)

 

Pour les print je fais cela :

var s: String?
print(s ?? "nil")
// "nil"
s = "test"
print(s ?? "nil")
// test

--

seb@stien as iLandes

Linked In, Twitter, GitHub, StackOverFlowiLandes.fr

 

Applications : Plages.TVGirondins33Jardiner avec la luneDVRGVMidi Note Converter, FreeIMC.

 

It's not a bug, it's a feature.

Feature : A bug as described by the marketing department (Apple II Reference Manuel 1979 page 180)

 


#12 Joanna Carter

Joanna Carter

    Broyeur de fèves

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

Posté 28 janvier 2017 - 12:03

Merci Joanna ;-)

 

Tu comprends ce qui fait le code dans le closure ? Ce n'était pas facile à trouver et, même moi, j'arrive à peine à le comprendre  ???  ::)



#13 iLandes

iLandes

    Torréfacteur de fèves

  • Membre
  • PipPipPipPipPip
  • 852 messages
  • LocationLandes

Posté 28 janvier 2017 - 19:12

Pour être plus concret j'ai modifier un eu l'exemple avec des données comme cela :

import Foundation
let d = Date()
let x:[String : Any?] = ["Nom" : "JeanSairien", "Age" : 35, "Sex" : nil, "update" : d]
let y = x.reduce([String : Any](),
                 {
                    var result = $0
                    
                    if let value = $1.value
                    {
                        result[$1.key] = value
                    }
                    
                    return result
})
print (x)
print (y)

La sortie de console donne

["Nom": Optional("JeanSairien"), "Sex": nil, "update": Optional(2017-01-28 18:07:52 +0000), "Age": Optional(35)]
["Nom": "JeanSairien", "update": 2017-01-28 18:07:52 +0000, "Age": 35]

En gros X est un tableau avec des infos clé/valeur de type [String:Any?]. Les clés sont en string et les valeurs en n'importe quoi (string, date, int...)

 

Y retire les clé/valeur quand la valeur est nil. On obtient donc un tableau clé/valeur de type [String:Any] débarrasser des clé/valeur non renseignée.

 

 

Je vois grosso modo ce que fait ton code bien que j'ai du mal à identifier $0 qui est [String : Any] et $1 qui est (key : String, value : any?) dans cette histoire.

 

Quoi qu'il en soit vous devez vous demander pourquoi faire tout cela pour résoudre mon problème initial de warning : 

Expression implicite coerced from Any? to Any

Le méchant compilateur n'est pas très coopératif en ne donnant pas clairement la ligne de se warning, juste la classe.  >:(

 

Je me servais plus loin dans mon code de se tableau pour poster une notification comme ceci :

// WARNING
NotificationCenter.default.post(name: FormNotification.ValueChange, object: nil, userInfo: x)

Maintenant je la poste comme ceci:

NotificationCenter.default.post(name: FormNotification.ValueChange, object: nil, userInfo: y)

Evidement je n'utilise pas x ou y comme nom dans mon projet définit mais un nom plus explicite :]

 

Grace aux code de Larme qui transform x en le warning disparait  :clap:

 

Tordu ou pas ?


--

seb@stien as iLandes

Linked In, Twitter, GitHub, StackOverFlowiLandes.fr

 

Applications : Plages.TVGirondins33Jardiner avec la luneDVRGVMidi Note Converter, FreeIMC.

 

It's not a bug, it's a feature.

Feature : A bug as described by the marketing department (Apple II Reference Manuel 1979 page 180)

 


#14 Joanna Carter

Joanna Carter

    Broyeur de fèves

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

Posté 28 janvier 2017 - 19:36

En gros X est un tableau avec des infos clé/valeur de type [String:Any?]. Les clés sont en string et les valeurs en n'importe quoi (string, date, int...)

 

Si je me permet ? X n'est pas un tableau, c'est un dictionnaire. On peut, quand-même, dire que les sont la même chose mais, c'est une différence assez importante  8--)


  • iLandes aime ceci

#15 iLandes

iLandes

    Torréfacteur de fèves

  • Membre
  • PipPipPipPipPip
  • 852 messages
  • LocationLandes

Posté 28 janvier 2017 - 19:39

Oui un dictionnaire tu as raison je suis dans l'euphorie de retrouver un projet sans warning.

 

Reste à résoudre pour mes connaissance personnelles d'où sorte ce $0, $1 c'est le seul truc que je pige pas bien dans ton code

 

Merci beaucoup !


--

seb@stien as iLandes

Linked In, Twitter, GitHub, StackOverFlowiLandes.fr

 

Applications : Plages.TVGirondins33Jardiner avec la luneDVRGVMidi Note Converter, FreeIMC.

 

It's not a bug, it's a feature.

Feature : A bug as described by the marketing department (Apple II Reference Manuel 1979 page 180)

 


#16 Joanna Carter

Joanna Carter

    Broyeur de fèves

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

Posté 28 janvier 2017 - 20:11

Voilà bon !

 

Le code avec les paramètres nommés à la place des paramètres anonymes :

    let d = Date()
    
    let x:[String : Any?] = ["Nom" : "JeanSairien", "Age" : 35, "Sex" : nil, "update" : d]
    
    let y = x.reduce([String : Any](),
    {
      (nextPartialResult: [String : Any], element: (key: String, value: Any?)) -> [String : Any] in
      
      var result = nextPartialResult
      
      if let value = element.value
      {
        result[element.key] = value
      }
      
      return result
    })

  • iLandes aime ceci




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

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