6

我有一个带有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. 我也无法在 swift book 中找到任何有用的东西。

4

2 回答 2

1

刚刚遇到了同样的问题,并且使用 Swift 4(也许在早期版本中,我还没有测试过),你可以associatedtype在它的定义中为你添加一个默认值:

protocol Foo: class {
  associatedtype Bar = Int  // notice the "= Int" here
  func fooFunction(bar: Bar)
}

无需为此向您的协议添加扩展。

(我在文档中找不到任何提及这一点,但它对我来说按预期工作,并且这样写似乎很自然。如果你可以链接到一些有信誉的来源,请随时在答案中编辑它)

于 2018-06-27T21:59:39.860 回答
-1

扩展上下文中有两种关联类型 Bar 可用,编译器无法推断出正确的一种。尝试这个。

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
}
于 2016-05-28T09:22:56.897 回答