Arrondir un CGFloat en Swift
Comment arrondir un CGFloat dans Swift?
J'ai essayé ceil(CDouble(myCGFloat))
mais qui ne fonctionne que sur l'iPad Air & iPhone 5S.
Lors de l'exécution sur un autre périphérique simulé, je reçois un message d'erreur indiquant que 'NSNumber' is not a subtype of 'CGFloat'
- Je pense que la raison c'est de travailler sur l'iPad Air & iPhone 5S est parce que CGFloats sont 64 bits sur les architectures; sur les architectures 32 bits, ils sont 32 bits.
- Je suis totalement confus, becaus Swift me dit qu'il n'a aucune idée de ce que
floor
ouceil
(oufloorf
ouceilf
) est.. - Je sais que c'était il y a longtemps, mais vous devez ajouter
import Foundation
- Pour le général arrondissement exemples avec
CGFloat
voir cette réponse.
Vous devez vous connecter pour publier un commentaire.
Mise à jour: Apple est désormais défini certains CGFloat des versions spécifiques de fonctions communes comme
ceil
:...en particulier pour faire face à la 32/64-bit différence. Si vous utilisez simplement
ceil
avec un CGFloat argument il devrait maintenant fonctionner sur toutes les architectures.Ma réponse originale à cette question:
C'est assez horrible, je pense, mais peut-on imaginer une meilleure façon?
#if
ne semble pas fonctionner pourCGFLOAT_IS_DOUBLE
; je pense que vous êtes limité à construire des configurations, à partir de ce Je peux voir dans la documentation de la compilation conditionnelle.ceil
fonctionne très bien. Si vous compilez pour une architecture 32 bits, CGFloat est un float, doncceilf
fonctionne très bien. Quel est le problème que vous voyez, exactement? (Voulez-vous ouvrir une nouvelle question à ce sujet? J'aimerais voir plus de discussions, mais les commentaires ici n'est probablement pas l'endroit.)CGFloat
est stockée dans, par exemple, unfloat
dans exécution, mais le code binaire s'attend à autre chose, parce que vous avez déjà forcé dans la compilation-temps pour travailler avec par exempledouble
plus tard dans exécution (ou vica-verset). s'il vous plaît, corrigez-moi si je me trompe.Avec Swift 4.2, selon vos besoins, vous pouvez choisir l'une des 3 façons suivantes pour arrondir un
CGFloat
.#1. À l'aide de
CGFloat
'srounded(_:)
méthodeFloatingPoint
protocole donne les types qui sont conformes à unarrondi(_:)
méthode.CGFloat
'srounded(_:)
a la déclaration suivante:Le terrain de jeu de l'échantillon de code suivant montre comment utiliser
rounded(_:)
afin d'arrondir unCGFloat
valeur:#2. À l'aide de
ceil(_:)
fonctionDarwin fournit un
ceil(_:)
fonction qui a la déclaration suivante:L'aire de Jeux de code ci-dessous montre comment utiliser
ceil(_:)
afin d'arrondir unCGFloat
valeur:#3. À l'aide de
NumberFormatter
Si vous voulez arrondir un
CGFloat
et de le formater avec le style de la même opération, vous pouvez utiliserNumberFormatter
.La plupart syntaxe correcte serait probablement:
À utiliser
ceil
je vais d'abord faire leCGFloat
unDouble
et après le plafond, je reconvertirCGFloat
.Qui fonctionne quand
CGFloat
est définie commeCFloat
ouCDouble
.Vous pouvez également définir une
ceil
pour des flotteurs (Ce qui a été effectivement mises en Swift 2):Alors vous serez en mesure d'appeler directement
tout en préservant la sécurité de type.
En fait je crois que ce devrait être la solution choisie par Apple, au lieu d'avoir un
ceil
etceilf
fonctions parce qu'ils n'ont pas de sens en Swift.'NSNumber' is not a subtype of 'CGFloat'
var f: CGFloat = 2.5
. Essayez de construire que pour un iPhone 5S.CGFloat
.de Swift De La Bibliothèque Standard vous pouvez autour de lui dans la place ainsi:
println("\(roundUp(Double(180.0)))") //prints 181, should print 180
Construction de holex de réponse. Je n'ai
-modifier l'extension édition-
J'ai aussi récemment transformé en une extension de Flotteurs j'ai pensé partager ainsi 🙂
Ceci est fait de sorte que vous pouvez juste être comme