Как я могу привести общий для соответствия протоколу в Swift, не объявляя конкретный тип?
class SomeModel<T: Equatable> {
var value: T?
...
}
Код ниже производит ошибку компиляции: Использование «Equatable» в качестве конкретного типа, соответствующего протоколу «Equatable»'не поддерживается .
switch model {
case let model as SomeModel<Equatable>:
someMethod(model)
break
default:
break
}
Как я могу обрабатывать все общие классы, соответствующие протоколу Equatable?Идея обрабатывать каждый разделенный тип не очень хороша, я думаю:
switch model {
case let model as SomeModel<Int>:
someMethod(model)
break
case let model as SomeModel<Double>:
someMethod(model)
break
case let model as SomeModel<Date>:
someMethod(model)
break
...
default:
break
}
Edit 1: Метод someMethod был добавлен в качестве примера, чтобы показать обработку модели,Во всяком случае, это может выглядеть так: func someMethod(_ model: SomeModel<Equatable>)
.Если невозможно передать такой аргумент, было бы достаточно иметь по крайней мере switch casting без вызова какой-либо функции или с вызывающей функцией без аргументов: func someMethod()
.
Изменить 2: Чтобы предоставить больше информации о проблеме.Класс SomeModel наследуется от другого класса BaseModel , поэтому объявление SomeModel выглядит следующим образом:
class SomeModel<T: Equatable>: BaseModel {
var value: T?
...
}
Я использую switch оператор для обработки различных подклассов BaseModel , и большинство из них не являются универсальными.
///Variable `models` here is of a type [BaseModel]
for model in models {
switch model {
case let model as SomeModel<Int>:
someMethod()
break
case let model as SomeModel<Double>:
someMethod()
break
case let model as SomeModel<Date>:
someMethod()
break
...
case let model as AnotherModel:
anotherMethod(model)
break
default:
break
}
}
Есть ли способ объединения SomeModel<Int>
, SomeModel<Double>
и т. д.?