Преобразование универсального класса в соответствие с протоколом Equatable - PullRequest
0 голосов
/ 20 сентября 2018

Как я могу привести общий для соответствия протоколу в 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> и т. д.?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...