Как объявить ограниченную универсальную переменную протокола в Swift?

Мне нужно создать словарную переменную, где мое значение будет SomeOtherClass класс и соответствует SomeProtocol, Это соответствует следующему объявлению в Objective-C:

NSMutableDictionary<SomeClass *, SomeOtherClass<SomeProtocol> *> *someOtherBySome;

Итак, возможно ли сделать это таким же простым способом, используя Swift?

Мне это нужно, потому что я могу создать func с подписью:

func someFunc<T: SomeOtherClass where T: SomeProtocol>(param: T, otherParam: String)

и я хочу получить значения для param параметр из Dictionary без литья типа.

1 ответ

Решение

Короткий ответ

В Swift вы не можете объявить переменную данного class и соответствуют protocol,

Возможное решение (?)

Однако, учитывая определения у вас уже есть

class SomeClass: Hashable {
    var hashValue: Int { return 0 } // your logic goes here
}

func ==(left:SomeClass, right:SomeClass) -> Bool {
    return true // your logic goes here
}

class SomeOtherClass {}
protocol SomeProtocol {}

может быть, вы можете решить свою проблему, просто делая SomeOtherClass соответствовать SomeProtocol

extension SomeOtherClass: SomeProtocol { }

Теперь вы можете просто

var dict : [SomeClass: SomeOtherClass] = [SomeClass(): SomeOtherClass()]

let someProtocolValue: SomeProtocol = dict.values.first!

Вам это поможет?

Другие вопросы по тегам