[Résolu] Convertir un NSString en un CGFloat

busterTheobusterTheo Membre
octobre 2015 modifié dans API UIKit #1

Bonjour,


un petit problème sympathique.


 


J'ai consulté tous (enfin presque) les posts sur le web à  ce sujet, et je fais donc comme j'ai compris.


Et lorsque je vérifie précisément, y'a une erreur de conversion. Pas très importante, mais cela demande d'être ultra précis.


 


voici un code d'exemple :



let str = "1.24232501828937"
let cgf = CGFloat((str as NSString).floatValue)
println("str = \(str)")
println("cgf = \(cgf)")

et cgf est différent de str.


 


J'ai ça en sortie :



 


str = 1.24232501828937


cgf = 1.24232506752014



 


Si quelqu'un a une idée, je suis preneur. Merci d'avance.


Mots clés:

Réponses

  • J'ai pas vraiment le temps de m'étendre sur le sujet parce que j'ai du travail mais ce code te permettra de faire ce que tu veux :



    import Foundation

    public extension CGFloat {
    init?(_ str: String) {
    if let double = Double(str) {
    self.init(double)
    } else {
    return nil
    }
    }
    }

    Tu colle ça dans un fichier à  part et tu peux maintenant initialiser un CGFloat depuis un String. Attention, c'est un failable initializer et donc renvoie nil si il n'arrive pas à  parser un nombre décimal dans le String que tu lui donne.


  • ola c'est du chinois pour moi - enfin merci quand même.


  • DrakenDraken Membre
    septembre 2015 modifié #4

    Tu as mal compris ce qui est expliqué sur StackOverFlow


     


    Remplace :



    let cgf = CGFloat((str as NSString).floatValue)

    Par :



    let cgf = CGFloat((str as NSString).doubleValue)

    Et ça marche (je viens de tester)


     



     


    str = 1.24232501828937


    cgf = 1.24232501828937


     


     


    CGFloat est une variable flottante en DOUBLE précision, ce qui nécessite l'utilisation de NSString.doubleValue.


     


    NSString.floatValue effectue la conversion en simple précision, moins précis.


  •  


     


    CGFloat est une variable flottante en DOUBLE précision, ce qui nécessite l'utilisation de NSString.doubleValue

    En fin de journée. J'éclate de rire. Excuse moi. Mais là , on est carrément dans le délire. C'est de la science fiction. Degré d'abstraction maximal. Moi, j'aimais bien le php...  :p


     


    Bon, je teste et je te répond. Merci beaucoup.


  • Ah ouais purée, ça marche grave.


     


    Un grand bravo à  toi, ou bien, comme tu le dis, j'avais



     


     


    mal compris ce qui est expliqué sur StackOverFlow

    désolé.


     


    Encore merci, ça va bien m'aider sur les histoires de bounds.origin.x avec les (CGAffineTransformTranslate) et tout y couanetis.


    Je galère encore sur ce sujet, mais cela fera certainement l'objet d'un nouveau post, lorsque j'aurai vraiment tout compris sur le sujet, et bloquerai encore.




  • En fin de journée. J'éclate de rire. Excuse moi. Mais là , on est carrément dans le délire. C'est de la science fiction. Degré d'abstraction maximal. Moi, j'aimais bien le php...  :p




    L'une des particularité de Swift est d'être un langage FORTEMENT typé. Moi j'aime bien ça.. 

  • AliGatorAliGator Membre, Modérateur
    Nan mais c'est vrai que Theo n'a pas tort, nous on est habitué, mais à  lire comme ça de quelqu'un qui débarque en Swift, voir un type de données issu d'Objective-C qui s'appelle "CGFloat" mais qui, sous le capot, est en fait un "double" (en tout cas depuis qu'on est passé de 32 à  64 bits) et pas un "float", du coup on se dit qu'il porte mal son nom ce type, il devrait s'appeler "CFDouble" (mais bon c'est historique). Du coup, je peux comprendre la confusion et l'envie d'initialiser un CGFloat à  partir d'un float (NSString.floatValue) et non d'un double (NSString.doubleValue)...
  • Oh mais moi je ne suis pas habitué. J'ai juste cherché comment faire avec une recherche Google .. Et j'ai compris après le pourquoi du comment, sachant que CGFloat est un double.

  • @Ali


    En fait, CGFloat désigne un flottant, donc le nom est aussi logique que NSInteger qui désigne un entier.


    Le seul piège, c'est que le nombre de bit utilisé pour le stocker n'est pas défini dans le nom.


    L'erreur c'est de supposer que CGFloat = float (c'est-à -dire un flottant 32 bits).


     


     


    @Theo


    En fait, ce n'est pas abstrait mais au contraire très concret.


    Entre deux nombres réels, il y a une infinité de nombre réels. Pour faire rentrer ça dans une mémoire d'ordinateur, il faut faire des sacrifices. En fonction de la quantité de bits qu'on utilise (32/64), on va pouvoir représenter plus ou moins de réels parmi l'infinité qu'il y a.


    Après si tu veux une précision connue sur un nombre de chiffres après la virgule donné sur un intervalle de réels connu, alors il faut utiliser une représentation à  virgule fixe et non pas flottante.


     


    C'est la réalité qui est abstraite (enfin sa représentation mathématique) et l'informatique qui est concrète.

  • merci pour tout ça.


     


    Je vois que nous avons des mathématiciens ici, ça fait plaisir.


     


    C'est justement un petit problème de trigo, tout con que je n'arrive pas à  résoudre. J'en ai plein dans mon projet, je les ai tous résolu, mais celui-ci, je bloque. ça bug. Je le posterai dans un prochain post, car je dois d'abord l'adapter dans un nouveau projet simple pour que cela soit explicite et sans cinquante variables ...


  • Soch cach toa ..

  • Joanna CarterJoanna Carter Membre, Modérateur


    Soch cach toa ..




    Ou, en anglais, Soh Cah Toa ;)


  • Soch cach toa ..




    D'abord on écrit :


    Sosh, Coach, et Toi. 


     


    Ensuite, sin(0) = 0; cos(1) = 0. ça suffit largement... Suffit au pire de redessiner un triangle rectangle avec un angle bien plus petit que l'autre et tu tu devineras si c'est l'adjacent ou l'opposé que tu dois divisé par l'hypoténuse...

  • Oui bon, mes derniers cours de trigonométrie remonte à  bien longtemps.


     


    Buster, c'est une formule mnémotechnique pour se rappeler les formules de base de la trigo.


     


    Sosh => Sinus = Opposé / Hypothenuse


     


    Cash => Cosinus = Adjacent / Hypothenuse


     


    Toa => Tangente = Opposé / Adjacent

  • Soh cah toa
  • C'est plus facile de s'en souvenir avec une prononciation "humaine" au lieu d'une formule de chimie.

  • busterTheobusterTheo Membre
    septembre 2015 modifié #19

    Ah ok, je comprend.


    Mais je n'ai pas besoin de mnémotechnique, j'ai mes notes, mes cours, mes bouquins, et surtout google.


    Donc, pas de soucis pour retrouver n'importe quelle formule de frigo, aussi complexe soit-elle (genre arc, etc). J'ai vraiment tout ce qu'il faut.


     


    Non, le soucis est lié à  une notion de  (je fais pas le dire en bon français) - pas trouver une distance mais la complémentaire d'une distance au sein d'une autre.


     


    Tout marche sur le papier mais pas en réel dans l'appli.


     


    De toute façon, je vais poster un nouveau post, mais je dois préparer le projet...


Connectez-vous ou Inscrivez-vous pour répondre.