扩展自定义类型,其中关联类型等于Void

时间:2016-10-27 11:14:54

标签: swift generics swift3 protocols protocol-extension

我的情况是我的自定义类型包含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中的限制?

1 个答案:

答案 0 :(得分:2)

从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>()