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