扩展关联类型等于 Void 的自定义类型

Extending custom type where associated type is equal to Void

我的情况是我有一个包含 associatedtype 的自定义类型。在等于 Void 的情况下,我希望有一些默认行为(以使调用站点更方便)。我试图将示例归结为:

protocol FooType {
    associatedtype T: Any
    var bar: (String) -> T { get }
}

struct Foo<T>: FooType {
    let bar: (String) -> T
}

extension Foo where T == Void { // Compile error: "Same-type requirement makes generic parameter 'T' non-generic".
    init() {
        self.bar = { _ in return }
    }
}

想法是,在泛型类型为 Void 的情况下,(在我的场景中)传入一个函数(在示例中名为 bar )没有意义).因此,我只想在此特定上下文中对此函数进行默认实现。

当尝试执行上述操作时,我得到 Same-type requirement makes generic parameter 'T' non-generic,这听起来与尝试限制时发生的情况非常相似,例如包含特定类型时的 Array 类型。一个解决方法是引入一个协议,但我不能为 Void 这样做。是否可以做我想做的事,或者这是目前 Swift 3 的限制?

从 Swift 3.1 开始,问题中发布的代码现在可以使用了。也就是说,以下内容现在可以正常工作:

protocol FooType {
    associatedtype T: Any
    var bar: (String) -> T { get }
}

struct Foo<T>: FooType {
    let bar: (String) -> T
}

extension Foo where T == Void { 
    init() {
        self.bar = { _ in return }
    }
}

let foo = Foo<String>(bar: { (t: String) in return "" })
let zoo = Foo<Void>()