2016-11-03 2 views
1

Я использую UIColor для сопоставления со значением в словаре, но я натолкнулся на действительно странную вещь. Половина моих ключей возвращает правильные значения, а другая половина - нет. Когда я сравниваю UIColors с использованием isEqual, они возвращают false, но хэш соответствует только штрафу.Сравнение UIColors не удается, но хеши равны?

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

Это возвращает следующие:

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

Любые идеи о том, почему это идет не так? Я проверял содержимое UIColor, и они одинаковы.

Когда я печатаю описание цвета вместо хеша, цвета снова отображаются одинаково. Странно, что он работает на половину цветов.

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

Являются ли цветы на самом деле равными? Я не уверен, но функция isEqual может проверять значения цвета, а не хэш. – Yan

+0

Да, цвета отображаются одинаково, когда я распечатываю их. – Recusiwe

+0

Насколько хэши равны, а не объект, проверьте эту статью http://nshipster.com/equality/ В ней указано, что «Однако обратное не выполняется: два объекта не обязательно должны быть равны, чтобы их хэш-значения быть равным »Можете ли вы распечатать цвета, для которых isEqual показывает false. – Yan

ответ

1

Я не очень уверен, с целью сделать это, но следует отметить, что Equatable ли принятая UIColor что означает, что вы можете сделать, проверить равенство UIColor экземпляров с помощью ==, например:

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") 

Надеюсь, это помогло.

Смежные вопросы