2016-06-14 1 views
1

J'utilise ce code dans mon projet Swift. Le code suivant a bien fonctionné à Swift 2, mais ne semblent pas travailler à Swift 3 plus, il donne l'erreur suivante:Swift 3 GCFloat à GCRect

Impossible d'affecter la valeur de type « (CGFloat, CGFloat, Int, Int) » pour taper 'CGRect'

if plusLayer == nil { 
     plusLayer = CALayer() 
     let halfWidth: CGFloat = self.bounds.size.width/2 
     let halfHeight: CGFloat = self.bounds.size.height/2 
     let ds: CGFloat = sqrt(halfWidth * halfWidth/2) 
     let x: CGFloat = halfWidth + ds - 27/2 
     let y: CGFloat = halfHeight - ds - 27/2 
     plusLayer.frame = (x, y, 27, 27) 
     plusLayer.contentsGravity = kCAGravityResizeAspectFill 
     if let i = plusSignImage { 
      plusLayer.contents = i.cgImage 
     } else { 
      plusSignImage = UIImage(named: "PlusSign", in: Bundle(for: self.dynamicType), compatibleWith: UITraitCollection(displayScale: UIScreen.main().scale)) 
      plusLayer.contents = plusSignImage!.cgImage 
     } 
     layer.addSublayer(plusLayer) 
    } 

Tout le monde sait comment je peux résoudre ce problème? Help'd être vraiment apprécié!

Merci! : D

+0

plusLayer.frame = CGRectMake (x, y, CGFloat (27), CGFloat (27)) fonctionne? –

+0

Etes-vous sûr que ce code a fonctionné avec Swift 2? Je ne peux pas le compiler - vous ne pouvez pas assigner un tuple à une structure. Utilisez l'initialiseur 'CGRect (x: x, y: y, largeur: 27, hauteur: 27)' – Hamish

Répondre

3

Cette ligne plusLayer.frame = (x, y, 27, 27)

devrait être plusLayer.frame = (x, y, 27 as CGFloat, 27 as CGFloat)

En effet, le CGRect initialiseur attend 4 numéros avec le même type. Jetez un oeil aux suggestions Xcode: enter image description here

+0

Cela donne cette erreur: Impossible d'affecter une valeur de type '(CGFloat, CGFloat, (CGFloat), (CGFloat)) '(aka' (CGFloat, CGFloat, CGFloat, CGFloat) ') pour taper' CGRect ' –

+0

@MatthijsOtterloo J'ai modifié ma réponse pour fournir la bonne solution et une explication. – BalestraPatrick

2

Vous avez besoin coulée explicite de 27 (un type Int) à CGFloat:

plusLayer.frame = (x, y, 27 as CGFloat, 27 as CGFloat) 
0

comme un vieux développeur, laissez faire un peu de clarté:

une) cast est une fonctionnalité puissante de certaines langues, mais elle doit être connue en détails

b) on peut lancer avec "as", mais ce n'est PAS la même chose que faire CGFloat (xx)

c) "as" doit être utilisé pour le moulage des objets. (voir: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html ) d) CGRectMake fonctionne dans 2.x/Xcode rapide 7.3

e) ne pas lancer de doubler, il suffit d'utiliser:

let r = CGRect(x: 10, y: 20, width: 30, height: 40) 

compilateur comprendre quel ces appels de méthode:

public init(x: CGFloat, y: CGFloat, width: CGFloat, height: CGFloat) 
public init(x: Double, y: Double, width: Double, height: Double) 
public init(x: Int, y: Int, width: Int, height: Int) 

et appellera la 3e.

Si vous écrivez:

let d = 10.0 
    let r2 = CGRect(x: d, y: 20, width: 30, height: 40) 

il appellera 2, comme d est une double.

mes deux cents.