使用协议扩展的默认关联类型

时间:2016-05-28 07:22:05

标签: swift swift-protocols protocol-extension

我有一个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。我也无法在快捷的书中找到任何有用的东西。

2 个答案:

答案 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
}