web-dev-qa-db-fra.com

Swift Double n'est pas convertible en CGFloat

J'essaie de dessiner un cercle simple quand j'arrive à la ligne suivante, le message d'erreur "Double is Not Convertable en CGFloat sous le startAngle = 0.0

path.addArcWithCenter(center, radius: radius, startAngle: 0.0, endAngle: Float(M_PI) * 2.0, clockwise: true)

Comment puis-je "cast" 0.0 pour le rendre CGFloat dans Swift?

La fonction complète que j'écris:

func drawCircle() {
    // Drawing code
    var bounds:CGRect = secondView.bounds
    var center = CGPoint()
    center.x = bounds.Origin.x + bounds.size.width / 2.0
    center.y = bounds.Origin.y + bounds.size.height / 2.0
    var radius = (min(bounds.size.width, bounds.size.height) / 2.0)
    var path:UIBezierPath = UIBezierPath()
    path.addArcWithCenter(center, radius: radius, startAngle: CGFloat(0.0), endAngle: Float(M_PI) * 2.0, clockwise: true)
    path.stroke()    
}
21
dcbenji

Convertissez les valeurs devant être CGFloat en CGFloat.

path.addArcWithCenter(center, radius: CGFloat(radius), startAngle: CGFloat(0.0), endAngle: CGFloat(M_PI) * 2.0, clockwise: true)

startAngle ne devrait probablement pas être converti si vous passez juste un littéral. Notez également que ce n'est pas une distribution de style C, mais une conversion entre différents types Swift. 

Edit: En regardant votre fonction entière, cela fonctionne.

func drawCircle() {
        // Drawing code
        var bounds:CGRect = self.view.bounds
        var center = CGPoint()
        center.x = bounds.Origin.x + bounds.size.width / 2.0
        center.y = bounds.Origin.y + bounds.size.height / 2.0
        var radius = (min(bounds.size.width, bounds.size.height) / 2.0)
        var path:UIBezierPath = UIBezierPath()
        path.addArcWithCenter(center, radius: CGFloat(radius), startAngle: CGFloat(0.0), endAngle: CGFloat(Float(M_PI) * 2.0), clockwise: true)
        path.stroke()    
    }
24
Connor

Vous devez taper le lancer via CGFloat (0.0). CGFloat a été ajusté pour être évalué différemment tout au long de la version bêta de Xcode 6 en raison du fait qu’en Obj-C, CGFloat se transforme en float ou en double selon la cible (64 bits contre 32 bits). Vous devez taper un numéro sur CGFloat dans Swift pour pouvoir utiliser un CGFloat, car il n’est jamais garanti qu’il y ait un flottant ou un double (car cela dépend de l’environnement). De cette façon, Swift n'acceptera pas une attaque et restera toujours "sûr". 

8
TheCodingArt

Ce n'est peut-être pas une bonne idée, mais j'ai utilisé NSNumber pour convertir Double en Float, puis en CGFloat.

let myFloat = NSNumber.init(value: myDouble).floatValue
let myCGFloat = CGFloat(myFloat)
0
AndrewAnders