我有一个associatedType
的协议。
我想在协议扩展中为该类型提供默认typealias
。这只适用于从特定类继承的类。
protocol Foo: class {
associatedtype Bar
func fooFunction(bar: Bar)
}
协议扩展:
extension Foo where Self: SomeClass {
typealias Bar = Int
func fooFunction(bar: Int) {
// Implementation
}
}
编译器抱怨'Bar' is ambiguous for type lookup in this context
。我也无法在快捷的书中找到任何有用的东西。
答案 0 :(得分:0)
遇到了同样的问题,并且使用Swift 4(也许在较早的版本中也没有测试),您可以在其定义中为associatedtype
添加一个默认值:
protocol Foo: class {
associatedtype Bar = Int // notice the "= Int" here
func fooFunction(bar: Bar)
}
无需为此在协议中添加扩展名。
(我在文档中找不到任何提及,但对我而言它按预期工作,以这种方式编写似乎很自然。如果您可以链接到一些信誉良好的资源,请随时在答案中进行编辑)
答案 1 :(得分:-1)
扩展上下文中有两个关联类型栏,编译器无法推断出正确的类型。试试这个。
protocol Foo: class {
associatedtype Bar
func fooFunction(bar: Bar)
}
extension Foo where Self: SomeClass {
func fooFunction(bar: SomeClass.Bar) {}
}
class SomeClass:Foo{
typealias Bar = Int
}