繁体   English   中英

将泛型初始化程序参数约束为类泛型类型

[英]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' 似乎编译器将AOther.A解释为不同的类型,我不知道为什么,因为初始化程序已将Other.AA限制为相同。 如果我用CaseIterable替换Hashable ,就没有问题。

有人可以解释为什么会这样吗?

你当然不能。 _doSomething类中的AnyFooBlock的类型,它是一个匿名函数 因此,您可以将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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM