Swift通用:无法编译泛型函数的调用

wgeznvg7  于 2023-03-28  发布在  Swift
关注(0)|答案(1)|浏览(109)

我对Swift泛型不是很在行。请你帮我解决这个编译错误:

protocol FooProtol<T> {
  associatedtype T
  func print(_: T)
}

class Foo: FooProtocol {
  typealias T = Bar
  func print(_ bar: Bar) {
    print("\(bar)")
  }
}

class Baz {
  func qux(foo: any FooProtocol) {
    let bar = Bar
    foo.print(bar) // Compilation error: "Cannot convert value of type 'Bar' to expected argument type '(some FooProtocol).T'"
  }
}
ivqmmu1c

ivqmmu1c1#

看起来你真的不需要一个不透明的类型,试着让你的qux方法成为泛型:

func qux<Foo: FooProtocol>(foo: Foo) {
    let bar = Bar()
    foo.print(bar) // Cannot convert value of type 'Bar' to expected argument type 'Foo.T'
}

现在添加通用约束:

func qux<Foo: FooProtocol>(foo: Foo) where Foo.T == Bar {
    let bar = Bar()
    foo.print(bar) // problem solved
}

相关问题