【问题标题】:Extending custom type where associated type is equal to Void扩展关联类型等于 Void 的自定义类型
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多