【问题标题】:Nested Generic Constraints: Constrain the T of a generic item inside a generic sequence extension that is constrained to that generic type嵌套通用约束:约束通用序列扩展内的通用项的 T,该通用序列扩展被约束到该通用类型
【发布时间】:2017-01-17 23:26:03
【问题描述】:

在 Swift 中,我们可以为序列等通用项编写扩展:

extension Sequence where Iterator.Element : ObservableType {

}

这将保证扩展仅适用于(在这种情况下)RxSwift observables 的序列。

但是,如果元素约束是另一个泛型,那么您可以约束该泛型吗?例如:

extension Sequence where Iterator.Element : ObservableType where E : MyType {

 }

在上面的伪代码(不起作用)中,意图是说:

这个扩展应该适用于 Observable 序列,其中 Observable 是 MyType 类型的 Observable,例如[可观察]

【问题讨论】:

    标签: swift generics


    【解决方案1】:

    您可以将Iterator.Element 限制为符合以下条件的类型 ObservableType 然后为 Iterator.Element 的关联类型 E 添加另一个约束:

    protocol ObservableType {
        associatedtype E
        // ...
    }
    
    class MyType { }
    
    extension Sequence where Iterator.Element: ObservableType, Iterator.Element.E: MyType {
    
    }
    

    【讨论】:

    • 那不完全一样,不是吗?这是对序列元素的两个约束?而不是元素应该是泛型的一个约束,而该元素应该是泛型的约束?或者你的意思是第二部分是 ObservableType.Element.E? (去试试)
    • @Cargowire:上面的代码将扩展限制为具有从 MyClass 继承的关联类型的 observables 序列。也许我忽略或误解了某些东西——这与您需要的不同吗?在哪种情况下它不会按预期工作?
    • 你说得对,我将第二个约束误读为“Iterator.Element”而不是“Iterator.Element.E”!
    猜你喜欢
    • 2013-12-26
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 2023-03-10
    相关资源
    最近更新 更多