3

我的情况是我有一个包含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 中的一个限制?

4

1 回答 1

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>()
于 2017-02-12T17:34:19.910 回答