Swift 3中仿制药的仿制药

Swift 3中仿制药的仿制药,swift,generics,swift3,Swift,Generics,Swift3,我面临一个奇怪的问题:我希望用另一个泛型类型约束一个泛型类型 让我解释一下,我有一个简单的泛型类型: class Simple<T : Equatable> { ... } class Complex<U : Simple> { ... } // WRONG! 最糟糕的是,想象一下如果我有这样的事情: class SimpleThing : Simple<Thing> { ... } let y = Complex<Thing, SimpleThin

我面临一个奇怪的问题:我希望用另一个泛型类型约束一个泛型类型

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

class Simple<T : Equatable> { ... }
class Complex<U : Simple> { ... } // WRONG!
最糟糕的是,想象一下如果我有这样的事情:

class SimpleThing : Simple<Thing> { ... }
let y = Complex<Thing, SimpleThing>()
只有Swift 3才有可能吗


提前感谢。

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

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>>()
协议SimpleType{
关联类型
}
类Simple:SimpleType{
类型别名Assoc=T
}
类复杂,其中U.Assoc:可平衡{
init(){
}
}
设c=Complex()

谢谢,对于一个看似简单的问题来说,这是一个有点复杂的解决方案。无论如何,这样看待这个问题是非常有用的。
class Complex<T : Equatable, U : Simple<T>> { ... } 
let x = Complex<Date, Simple<Date>>()
class SimpleThing : Simple<Thing> { ... }
let y = Complex<Thing, SimpleThing>()
let x = Complex<Simple<Date>>()
let y = Complex<SimpleThing>()
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>>()