2016-11-08 2 views
3

Cela doit avoir été demandé auparavant, mais je ne trouve pas de référence appropriée. J'ai trouvé ceci question, mais cela compare trois nombres l'un avec l'autre. J'essaie de comparer 2 UIColor (s) pour éviter la duplication. Chaque couleur est référencée dans r, g, b, alpha. Je forme les couleurs pour pouvoir contrôler le formatage des nombres.Comparer 2 UIColor (s)

Quelle serait la bonne façon de gérer cela?

Toute aide appréciée.

+0

Donc, vous voulez savoir si 2 couleurs le même? –

+0

Comparer des couleurs n'est pas une tâche triviale, voulez-vous les comparer par leur valeur RGBA? – fpg1503

+1

@appzYourLife, @ fpg1503 Si je me souviens bien, 'UIColor' est' Equatable' – user28434

Répondre

3

Si vous créez toutes les couleurs de la même manière, vous pouvez simplement utiliser ==.

Si vos couleurs sont dans différents espaces de couleurs et vous voulez juste de comparer leur valeur RGBA utiliser les éléments suivants:

extension UIColor { 
    func equals(_ rhs: UIColor) -> Bool { 
     var lhsR: CGFloat = 0 
     var lhsG: CGFloat = 0 
     var lhsB: CGFloat = 0 
     var lhsA: CGFloat = 0 
     self.getRed(&lhsR, green: &lhsG, blue: &lhsB, alpha: &lhsA) 

     var rhsR: CGFloat = 0 
     var rhsG: CGFloat = 0 
     var rhsB: CGFloat = 0 
     var rhsA: CGFloat = 0 
     rhs.getRed(&rhsR, green: &rhsG, blue: &rhsB, alpha: &rhsA) 

     return lhsR == rhsR && 
       lhsG == rhsG && 
       lhsB == rhsB && 
       lhsA == rhsA 
    } 
} 

Par exemple:

let white1 = UIColor.white 
let white2 = UIColor(colorLiteralRed: 1, green: 1, blue: 1, alpha: 1) 
white1 == white2 //false 
white1.cgColor == white2.cgColor //false 
white1.equals(white2) //true 
+1

Très bonne réponse –

+1

Cela a fonctionné parfaitement. Merci beaucoup –

0

Si vous initialisez comme UIColor, vous devriez être en mesure de comparer les couleurs les unes aux autres facilement:

import UIKit 

let myFirstColor = UIColor.red 
let mySecondColor = UIColor.red 
let myThirdColor = UIColor(colorLiteralRed: 1.0, green: 0.0, blue: 0.0, alpha: 1.0) 
let iosWhite = UIColor.white 
let myWhite = UIColor(white: 1.0, alpha: 1.0) 

myFirstColor == mySecondColor //True 
myFirstColor == myThirdColor //True 
iosWhite == myWhite // True 

des commentaires, là cas de pointe. Je pense que ce sont tous gray s black, white et clear. Pour compenser, vous pouvez créer votre propre grays et comparer à lui:

let myOtherWhite = UIColor(colorLiteralRed: 1.0, green: 1.0, blue: 1.0, alpha: 1.0) 

qui est pas égal-UIColor.white

Cela dit, il est facile de trouver les cas de bord sur terrain de jeu: enter image description here

+1

Ne fonctionne pas pour 'UIColor.white' et' UIColor (colorLiteralRed: 1, vert: 1, bleu: 1, alpha: 1) ' – fpg1503

+0

Essayez-le dans la cour de récréation. Blanc a seulement w: 1.0 et a: 1.0 – Idan

+1

Exactement, ils sont créés différemment, c'est pourquoi c'est un cas de bord approprié – fpg1503