Как объявить ограниченную универсальную переменную протокола в 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!
Вам это поможет?