2016-01-13 3 views
9

У меня есть несколько типов значений «Любой», которые я хочу сравнить.Как сравнить «любые» типы значений

var any1: Any = 1 
var any2: Any = 1 

var any3: Any = "test" 
var any4: Any = "test" 

print(any1 == any2) 
print(any2 == any3) 
print(any3 == any4) 

Использование оператора == показывает ошибку:

"Binary operator '==' cannot be applied to two 'Any' (aka 'protocol<>') operands"

Что бы способ сделать это?

+5

Как вы можете сравнить вещи, о которых вы ничего не знаете? Почему вы делаете их «Любые»? – Wain

+1

Я просто тестирую быстрые возможности. –

+1

@theReverend '===' сравнивает ссылки, поэтому их можно применять только к ссылочным типам, которые все они соответствуют 'AnyObject' –

ответ

13

Единственный способ сделать это с помощью функции, кроме ==, который принимает параметр типа, а затем сравнивает значения, если они оба этого типа:

func isEqual<T: Equatable>(type: T.Type, a: Any, b: Any) -> Bool? { 
    guard let a = a as? T, let b = b as? T else { return nil } 

    return a == b 
} 

Теперь, используя переменные выше, вы можете сравнить их следующим образом:

var any1: Any = 1 
var any2: Any = 1 

var any3: Any = "test" 
var any4: Any = "test" 

isEqual(Int.self, a: any1, b: any2)  // true 
isEqual(Int.self, a: any2, b: any3)  // nil 
isEqual(String.self, a: any3, b: any4) // true 
3

Для использования оператора == тип должен соответствовать протоколу Equatable. Any протокол не соответствует протоколу Equatable, поэтому нет возможности сравнить два значения Any. Логично - Any - слишком широкий термин - значения не могут иметь «общего знаменателя».

Более того, Swift не позволяет сравнивать два значения Equatable, которые имеют различный тип. Например. оба Int и String соотвествие Equatable но 1 == "1" не скомпилируется. Причиной этого является объявление == в протоколе Equatable: func ==(lhs: Self, rhs: Self) -> Bool. Это «Я» в основном означает, что оба аргумента должны иметь один и тот же тип. Это своего рода заполнитель - в реализации для определенного типа, Self следует заменить на имя этого типа.

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