2016-11-03 5 views
1

J'utilise UIColor pour mapper une valeur dans un dictionnaire, mais je suis tombé sur une chose vraiment étrange. La moitié de mes clés renvoie les bonnes valeurs et l'autre moitié non. Quand je compare les UIColors en utilisant isEqual, ils retournent false, mais le hachage correspond parfaitement.La comparaison des UIColors échoue, mais les hachages sont égaux?

for key in colorToAllocationCurrent.keys { 
      print("\(key.hash) ---> \(currentColor!.hash)") 
      print(key.isEqual(currentColor)) 
     } 

Ce renvoie les éléments suivants:

144048128 ---> 151431738 
false 
155123712 ---> 151431738 
false 
147739933 ---> 151431738 
false 
151431738 ---> 151431738 <-------- EQUAL? 
false 

Des idées sur pourquoi cela ne va pas? J'ai vérifié le contenu de l'UIColor, et ils sont identiques.

Lorsque j'imprime la description de la couleur au lieu du hachage, les couleurs redeviennent identiques. La chose étrange est que cela fonctionne sur la moitié des couleurs.

for key in colorToAllocationCurrent.keys { 
      print("\(key.description) ---> \(currentColor!.description)") 
      print(key.isEqual(currentColor)) 
     } 

UIExtendedSRGBColorSpace 1 0 0 1 ---> UIExtendedSRGBColorSpace 1 0.666667 0 1 
false 
UIExtendedSRGBColorSpace 1 1 0 1 ---> UIExtendedSRGBColorSpace 1 0.666667 0 1 
false 
UIExtendedSRGBColorSpace 1 0.333333 0 1 ---> UIExtendedSRGBColorSpace 1 0.666667 0 1 
false 
UIExtendedSRGBColorSpace 1 0.666667 0 1 ---> UIExtendedSRGBColorSpace 1 0.666667 0 1 
false 
+0

Les couleurs sont-elles réellement égales? Je ne suis pas sûr mais la fonction d'IsEqual pourrait vérifier les valeurs de couleur et pas le hachage. – Yan

+0

Oui, les couleurs apparaissent égales lorsque je les imprime. – Recusiwe

+0

Dans la mesure où Hashes étant égaux et non l'objet consultez cet article http://nshipster.com/equality/ Il déclare que "Cependant, l'inverse ne tient pas: deux objets ne doivent pas être égaux pour que leurs valeurs de hachage à être égal "Pouvez-vous imprimer les couleurs pour lesquelles isEqual montre faux. – Yan

Répondre

1

Je ne suis pas assez sûr du but de le faire, mais il faut noter que Equatable n'adopté par UIColor ce qui signifie que vous pouvez faire vérifier l'égalité des UIColor instances à l'aide ==, par exemple:

let col1 = UIColor.red 
let col2 = UIColor.red 

// the output is "matched" 
print(col1 == col2 ? "matched" : "no match") 

let customCol1 = UIColor(colorLiteralRed: 123.0/255.0, green: 243.0/255.0, blue: 46.0/255.0, alpha: 0.9) 
let customCol2 = UIColor(colorLiteralRed: 123.0/255.0, green: 243.0/255.0, blue: 46.0/255.0, alpha: 0.9) 

// the output is "matched" 
print(customCol1 == customCol2 ? "matched" : "no match") 

let customCol3 = UIColor(colorLiteralRed: 123.0/255.0, green: 243.0/255.0, blue: 46.0/255.0, alpha: 0.9) 
let customCol4 = UIColor(colorLiteralRed: 123.0/255.0, green: 243.0/255.0, blue: 46.0/255.0, alpha: 1.0) 

// the output is "no match" 
print(customCol3 == customCol4 ? "matched" : "no match") 

Espérons que cela a aidé.