рассмотрит следующий упрощенный фрагмент кода:Как сравнить общие объекты в Swift?
class Foo<T: Equatable> {
var x: T
init(_ x: T, _ y: T) {
self.x = x
if (x == y) {
// do something
}
}
}
Я хотел бы этот класс работать для всех видов T
с, которые как-то сопоставимы. В идеале он сравнивал бы тождества, если T является объектом и напрямую сравнивает все остальное, что соответствует Equatable
.
Приведенный выше код не работает, например, для Array
. Если я изменю Equatable
на AnyObject
и ==
до ===
, то это не сработает для Int
s. Как решить эту проблему? Я думал о создании своего собственного протокола, но потом не мог понять, как его реализовать для всех типов, которые соответствуют Equatable
.
Edit:
Я не знал, что он будет работать на Mac, потому что я нахожусь на Linux, и когда я пытаюсь скомпилировать
Foo<[Int]>([1, 2], [1, 2])
Я получаю следующее сообщение об ошибке:
error: type '[Int]' does not conform to protocol 'Equatable'
Foo<[Int]>([1, 2], [1, 2])
^
Что вы имеете в виду «не работает «? Он не будет компилироваться, если вы попытаетесь инициализировать его массивами? Каково сообщение об ошибке? – nhgrif
@nhgrif Общий массив не может быть равным, в прямом смысле, а скорее содержать элементы, которые являются равнозначными. Но я согласен снова прочитать Q, что это неясно (это было, однако, моя интерпретация Q). – dfri
Используя код в вопросе, я могу назвать этот код: 'let f1 = Foo ([1,2,3], [1,2,3])', который отлично работает (и говорит, что они равны). Почему это не работает? Более того, даже если массив имеет несколько типов, например: 'let f1 = Foo ([" string ", 2,3.14], [" string ", 2,3.14])' он работает отлично (и говорит, что они равны). – nhgrif