Давайте предположим, что у меня protocol Foo
с associatedtype Bar
.Есть ли способ использовать этот же ассоциированный тип в качестве ограничения в универсальной функции внутри этого же протокола?
Для иллюстрации:
protocol Foo {
associatedtype Bar
func example<T: Bar>() -> T
}
Это выдаст Inheritance from non-protocol, non-class type 'Self.Bar'
.Это имеет смысл, потому что во время компиляции мы не знаем, какой тип Bar будет .
Тем не менее, по какой-то причине, даже если я определю тип Bar, я будувсе равно получаю такую же ошибку.Примерно так:
protocol Foo {
associatedtype Bar: NSObject //OR: Protocol
func example<T: Bar>() -> T //Compile Error: Inheritance from non-protocol, non-class type 'Self.Bar'
}
Оба этого и этого вопросов касаются одной и той же проблемы, но, по моему честному мнению, ни один из них не является реальным ответом.
Также, возможно, я подхожу к этому с неправильной точки зрения языка, но для визуализации моего варианта использования: мне нужно, чтобы, когда класс определял тип Bar
, каждый T
использовался в функции example()
, должен иметь тип Bar
, но зная, какой тип он вернет.Чтобы проиллюстрировать, что было бы моим уровнем техники:
protocol Foo {
associatedtype Bar: NSObject //OR: Protocol
//Compile Error: Inheritance from non-protocol, non-class type 'Self.Bar'
func example<T: Bar>() -> T //OR: func example<T>() -> T where T: Bar
}
class ExampleBarType: NSObject { }
class ExampleObject: ExampleBarType { }
class FooImplementation: Foo {
typealias Bar = ExampleBarType
func example<T: Bar>() -> T { //OR: func example<T>() -> T where T: Bar {
}
}
Я просто не могу понять, почему компилятор не может предположить, что мой связанный тип будет тем, который я определил.Заранее спасибо.