2016-12-26 3 views
0

Je viens de commencer la migration du code Swift vers Swift 3. La mise en forme pour les constantes de couleur a changé dePourquoi UIColor.white, rouge, vert et bleu ne fonctionnent pas, mais toutes les autres constantes de couleur fonctionnent bien?

let color = UIColor.yellowColor() // Swift 2 
let color = UIColor.yellow // Swift 3 

La plupart du code de mon projet a migrait plus très bien en utilisant cette nouvelle syntaxe. Cependant, certaines des constantes de couleur UIColor ne fonctionnent pas: UIColor.white, UIColor.red, UIColor.green et UIColor.blue. Toutes les autres constantes UIColor, comme UIColor.yellow, fonctionnent très bien. Les constantes de dysfonctionnement apparaissent dans la saisie semi-automatique, et les sites Web en ligne rapportent qu'ils fonctionnent (http://leaks.wanari.com/2016/09/26/converting-project-swift-3-0/).

Cependant, quand je compile le fichier suivant:

import SpriteKit 

let aColor = UIColor.black 
let aColor2 = UIColor.darkGray 
let aColor3 = UIColor.lightGray 
let aColor4 = UIColor.white 
let aColor5 = UIColor.gray 
let aColor6 = UIColor.red 
let aColor7 = UIColor.green 
let aColor8 = UIColor.blue 
let aColor9 = UIColor.cyan 
let aColor10 = UIColor.yellow 
let aColor11 = UIColor.magenta 
let aColor12 = UIColor.orange 
let aColor13 = UIColor.purple 
let aColor14 = UIColor.brown 
let aColor15 = UIColor.clear 

let aFakeColor = UIColor.fakeColor 

Il donne les erreurs suivantes:

enter image description here

Instance member 'white' cannot be used on type 'UIColor' 
Instance member 'red' cannot be used on type 'UIColor' 
Instance member 'green' cannot be used on type 'UIColor' 
Instance member 'blue' cannot be used on type 'UIColor' 
Type 'UIColor' has no member 'fakeColor' 

Maintenant, la dernière erreur est parfaitement logique; il n'y a pas de constante de couleur appelée fakeColor. Mais cela montre que le compilateur voit les constantes de couleur défectueuses, car il donne une erreur différente. Selon la norme Apple's documentation, les constantes de couleur défectueuses existent. Pourquoi mon compilateur ne peut-il pas les voir?

+3

Avez-vous essayé votre propre projet et réécrire les lignes qui causent le problème. Êtes-vous capable de construire le projet? – Starlord

+0

@Joakim Juste nettoyé le projet, et il donne toujours les mêmes erreurs quand je construis. D'autres idées? – Cin316

+0

Il s'agit d'une paille mais j'essaierais peut-être d'importer UIKit directement si ce n'est déjà fait. –

Répondre

4

Mise à jour: J'ai trouvé le problème.

J'ai eu une extension à UIColor qui l'a fait agir plus Swifty. Il a permis d'accéder aux composants RVB comme indiqué ci-dessous. Maintenant que UIColor a red, green, et blue propriétés qui représentent les couleurs rouge, vert et bleu, il y avait un conflit.

Pour toute personne rencontrant un problème similaire: assurez-vous de vérifier si vous avez des extensions qui causent le problème.

Swift 2 Extension

// 
// UIColor+Swifty.swift 
// 
// Created by Cin316 on 3/6/16. 
// Usage is permitted under the MIT license. 
// This does not work in Swift 3.0 ! 
// 

import SpriteKit 

public extension UIColor { 

    public var alpha: CGFloat? { 
     get { 
      var a: CGFloat = 0 
      if (self.getWhite(nil, alpha: &a)) { 
       return a 
      } else { 
       return nil 
      } 
     } 
    } 

    public var white: CGFloat? { 
     get { 
      var w: CGFloat = 0 
      if (self.getWhite(&w, alpha: nil)) { 
       return w 
      } else { 
       return nil 
      } 
     } 
    } 

    public var red: CGFloat? { 
     get { 
      var r: CGFloat = 0 
      if (self.getRed(&r, green: nil, blue: nil, alpha: nil)) { 
       return r 
      } else { 
       return nil 
      } 
     } 
    } 
    public var green: CGFloat? { 
     get { 
      var g: CGFloat = 0 
      if (self.getRed(nil, green: &g, blue: nil, alpha: nil)) { 
       return g 
      } else { 
       return nil 
      } 
     } 
    } 
    public var blue: CGFloat? { 
     get { 
      var b: CGFloat = 0 
      if (self.getRed(nil, green: nil, blue: &b, alpha: nil)) { 
       return b 
      } else { 
       return nil 
      } 
     } 
    } 

    public var hue: CGFloat? { 
     get { 
      var h: CGFloat = 0 
      if (self.getHue(&h, saturation: nil, brightness: nil, alpha: nil)) { 
       return h 
      } else { 
       return nil 
      } 
     } 
    } 
    public var saturation: CGFloat? { 
     get { 
      var s: CGFloat = 0 
      if (self.getHue(nil, saturation: &s, brightness: nil, alpha: nil)) { 
       return s 
      } else { 
       return nil 
      } 
     } 
    } 
    public var brightness: CGFloat? { 
     get { 
      var b: CGFloat = 0 
      if (self.getHue(nil, saturation: nil, brightness: &b, alpha: nil)) { 
       return b 
      } else { 
       return nil 
      } 
     } 
    } 

} 

Swift 3 Extension

// 
// UIColor+Swifty.swift 
// 
// Created by Cin316 on 3/6/16. 
// Usage is permitted under the MIT license. 
// Notice the addition of "Comp" to conflicting properties. 
// 

import SpriteKit 

public extension UIColor { 

    public var alphaComp: CGFloat? { 
     get { 
      var a: CGFloat = 0 
      if (self.getWhite(nil, alpha: &a)) { 
       return a 
      } else { 
       return nil 
      } 
     } 
    } 

    public var whiteComp: CGFloat? { 
     get { 
      var w: CGFloat = 0 
      if (self.getWhite(&w, alpha: nil)) { 
       return w 
      } else { 
       return nil 
      } 
     } 
    } 

    public var redComp: CGFloat? { 
     get { 
      var r: CGFloat = 0 
      if (self.getRed(&r, green: nil, blue: nil, alpha: nil)) { 
       return r 
      } else { 
       return nil 
      } 
     } 
    } 
    public var greenComp: CGFloat? { 
     get { 
      var g: CGFloat = 0 
      if (self.getRed(nil, green: &g, blue: nil, alpha: nil)) { 
       return g 
      } else { 
       return nil 
      } 
     } 
    } 
    public var blueComp: CGFloat? { 
     get { 
      var b: CGFloat = 0 
      if (self.getRed(nil, green: nil, blue: &b, alpha: nil)) { 
       return b 
      } else { 
       return nil 
      } 
     } 
    } 

    public var hue: CGFloat? { 
     get { 
      var h: CGFloat = 0 
      if (self.getHue(&h, saturation: nil, brightness: nil, alpha: nil)) { 
       return h 
      } else { 
       return nil 
      } 
     } 
    } 
    public var saturation: CGFloat? { 
     get { 
      var s: CGFloat = 0 
      if (self.getHue(nil, saturation: &s, brightness: nil, alpha: nil)) { 
       return s 
      } else { 
       return nil 
      } 
     } 
    } 
    public var brightness: CGFloat? { 
     get { 
      var b: CGFloat = 0 
      if (self.getHue(nil, saturation: nil, brightness: &b, alpha: nil)) { 
       return b 
      } else { 
       return nil 
      } 
     } 
    } 

}