[英]Constraining a generic initilizer parameter to class generic type
我正在尝试为协议实现类型擦除包装器。 我有一个协议,其关联类型限制为CaseIterable
和使用该类型的方法。
给定以下定义:
protocol Foo {
associatedtype A: CaseIterable
func doSomething(input: A)
}
final class AnyFoo<A: CaseIterable>: Foo {
private let _doSomething: (A) -> Void
init<Other: Foo>(wrappedFoo: Other) where Other.A == A {
// "Cannot assign value of type '(Other.A) -> ()' to type '(A) -> Void'"
_doSomething = wrappedFoo.doSomething(input:)
}
func doSomething(input: A) {
_doSomething(input)
}
}
我收到错误Cannot assign value of type '(Other.A) -> ()' to type '(A) -> Void'
。 似乎编译器将A
和Other.A
解释为不同的类型,我不知道为什么,因为初始化程序已将Other.A
和A
限制为相同。 如果我用CaseIterable
替换Hashable
,就没有问题。
有人可以解释为什么会这样吗?
你当然不能。 _doSomething
类中的AnyFoo
是Block
的类型,它是一个匿名函数。 因此,您可以将wrappedFoo.doSomething(input:)
分配给它。 当你调用_doSomething(input)
时,它实际上调用wrappedFoo.doSomething(input: input)
。
以另一种方式,您可以定义一个Block
,如:
let completion: (bool) -> void = { finished in
}
但你不能像这样定义它:
let completion: (true) -> void = { finished in
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.