【问题标题】:Generics of generics in Swift 3Swift 3 中的泛型
【发布时间】:2016-11-22 21:21:07
【问题描述】:

我遇到了一个奇怪的问题,这里是:我希望用另一种泛型类型来约束一个泛型类型。

让我解释一下,我有一个简单的泛型类型:

class Simple<T : Equatable> { ... }

而且我希望用这个简单(泛型)类型有另一个泛型类型约束:

class Complex<U : Simple> { ... } // WRONG!

当然那不编译也不这样:

class Complex<U : Simple<T : Equatable>> { ... } // WRONG!

也不:

class Complex<U : Simple<T>> where T : Equatable { ... } // WRONG!

我找到的唯一方法是:

class Complex<T : Equatable, U : Simple<T>> { ... } 

所以我需要在每个实例上重复T

let x = Complex<Date, Simple<Date>>()

最糟糕的是,想象一下,如果我有类似的东西:

class SimpleThing : Simple<Thing> { ... }
let y = Complex<Thing, SimpleThing>()

我如何声明Complex 以这种方式使用它?:

let x = Complex<Simple<Date>>()
let y = Complex<SimpleThing>()

只有在 Swift 3 中才有可能吗?

提前致谢。

【问题讨论】:

    标签: swift generics swift3


    【解决方案1】:

    如果我理解您想要正确执行的操作,则可以使用具有关联类型的协议来实现。您可以使您的 Simple 类符合它,然后将 Complex 上的类型参数约束为其符合类型,最后对关联类型进行限定。应该是这样的:

    protocol SimpleType {
        associatedtype Assoc
    }
    
    class Simple<T: Equatable>: SimpleType {
        typealias Assoc = T
    }
    
    class Complex<U: SimpleType> where U.Assoc: Equatable {
        init() {
    
        }
    }
    
    let c = Complex<Simple<Date>>()
    

    【讨论】:

    • 谢谢,对于一个看似简单的问题,这有点复杂。无论如何,以这种方式看待这个问题非常有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多