gpt4 book ai didi

swift - Swift 3 中泛型的泛型

转载 作者:搜寻专家 更新时间:2023-10-31 22:29:51 24 4
gpt4 key购买 nike

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

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

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 才有可能吗?

提前致谢。

最佳答案

如果我理解您想正确地做什么,这可以通过具有关联类型的协议(protocol)来实现。您可以使您的 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>>()

关于swift - Swift 3 中泛型的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40751855/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com