【发布时间】:2016-10-27 11:14:53
【问题描述】:
我有一个包含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 generics swift3 protocols protocol-extension