Convertir une chaîne en CGFloat dans Swift

Je suis nouveau sur Swift, comment puis-je convertir une chaîne en CGFloat?

J’ai essayé:

var fl: CGFloat = str as CGFloat var fl: CGFloat = (CGFloat)str var fl: CGFloat = CGFloat(str) 

tout n’a pas fonctionné

Si vous voulez un moyen sûr de le faire, voici une possibilité:

 let str = "32.4" if let n = NSNumberFormatter().numberFromSsortingng(str) { let f = CGFloat(n) } 

Si vous changez str en “bob”, il ne sera pas converti en float, alors que la plupart des autres réponses deviendront 0.0.

Pour Swift 3.0, je ferais quelque chose comme ceci:

 let str = "32.4" guard let n = NSNumberFormatter().number(from: str) else { return } // Use `n` here 

Dans Swift 4, NSNumberFormatter a été renommé NumberFormatter :

 let str = "32.4" guard let n = NumberFormatter().number(from: str) else { return } 

À partir de Swift 2.0, le type Double a un initialiseur disponible qui accepte une Ssortingng . Le moyen le plus sûr de passer de Ssortingng à CGFloat est:

 let ssortingng = "1.23456" var cgFloat: CGFloat? if let doubleValue = Double(ssortingng) { cgFloat = CGFloat(doubleValue) } // cgFloat will be nil if ssortingng cannot be converted 

Si vous devez le faire souvent, vous pouvez append une méthode d’extension à Ssortingng :

 extension Ssortingng { func CGFloatValue() -> CGFloat? { guard let doubleValue = Double(self) else { return nil } return CGFloat(doubleValue) } } 

Notez que vous devriez retourner un CGFloat? car l’opération peut échouer.

Vous devez lancer la ssortingng pour double , puis lancer du double au CGFloat , essayez ceci:

 let fl: CGFloat = CGFloat((str as NSSsortingng).doubleValue) 

Cela marche:

 let str = "3.141592654" let fl = CGFloat((str as NSSsortingng).floatValue) 

dans Swift 3.0

 if let n = NumberFormatter().number(from: ssortingng) { let f = CGFloat(n) } 

ou cela si vous êtes sûr que la chaîne répond à toutes les exigences

 let n = CGFloat(NumberFormatter().number(from: ssortingng)!) 

Alors que les autres réponses sont correctes, mais le résultat que vous voyez aura des décimales finales.

Par exemple:

 let str = "3.141592654" let foo = CGFloat((str as NSSsortingng).floatValue) 

Résultat:

 3.14159274101257 

Pour obtenir une valeur correcte de la chaîne, essayez ce qui suit:

 let str : Ssortingng = "3.141592654" let secStr : NSSsortingng = str as NSSsortingng let flt : CGFloat = CGFloat(secStr.doubleValue) 

Résultat:

 3.141592654 

Vous pouvez créer une extension qui ajoute une init à CGFloat

 extension CGFloat { init?(ssortingng: Ssortingng) { guard let number = NumberFormatter().number(from: ssortingng) else { return nil } self.init(number.floatValue) } } 

Utilisez-le comme ça, donc let x = CGFloat(xSsortingng)

C’est un peu un travail de contournement, mais vous pouvez le convertir en NSSsortingng, puis obtenir la valeur float, puis initialiser un CGFloat à partir de cette valeur. Exemple:

 let str = "1.02345332" let foo = CGFloat((str as NSSsortingng).floatValue) 

dans Swift 3.1

 if let n = NumberFormatter().number(from: ssortingng) { let fl = CGFloat(n) } 

ou:

 let fl = CGFloat((str as NSSsortingng).floatValue)) 

Bonne question. Il n’y a en fait aucune API Swift pure pour convertir une chaîne représentant un CGFloat en un CGFloat. Le seul nombre représenté par une chaîne que Swift pur vous permet de convertir en un nombre est un entier. Vous devrez utiliser une autre approche d’une autre bibliothèque – par exemple, commencez par NSSsortingng ou C (Darwin) strtod .