gpt4 book ai didi

generics - 使用 Self 作为通用类型

转载 作者:IT王子 更新时间:2023-10-29 05:21:07 26 4
gpt4 key购买 nike

Self 可以用作方法的返回类型:

func doSomething() -> Self {}

是否可以以某种方式将 Self 用作像这样的泛型类型?

func doSomething() -> Wrapper<Self> {}

示例

如果我可以将 ChristmasPresent 子类化并让它有一个 wrapped 函数返回一个 WrappedPresent 并且泛型设置为子类是什么,那就太好了。

class ChristmasPresent {
func wrapped() -> WrappedPresent<Self> {
return WrappedPresent(present: self)
}
}

class WrappedPresent<T: ChristmasPresent> {
var present: T

init(present: T) {
self.present = present
}
}

class ToyCar: ChristmasPresent {}

let wrappedToyCar = ToyCar().wrapped() // Inferred to be: WrappedPresent<ToyCar>

最佳答案

Swift 中最令人头疼的悖论是:“Swift 更喜欢方法,但 Swift 的函数更强大。” Swift 团队知道这一点,我相信总有一天我们会拥有强大的方法。但今天不是那一天。有很多你想用你不能的方法来表达的东西。然而,您想要的一切都可以通过函数轻松完成。

class ChristmasPresent {}

struct WrappedPresent<T: ChristmasPresent> {
let present: T
}

func wrap<T:ChristmasPresent>(present: T) -> WrappedPresent<T> {
return WrappedPresent(present: present);
}

class ToyCar: ChristmasPresent {}

let wrappedToyCar = wrap(ToyCar()) // Inferred to be: WrappedPresent<ToyCar>

请注意,如果您的代码确实 编译了,您可能仍然会对结果感到非常惊讶。 Swift custom types are not covariant , 所以 WrappedPresent<ToyCar>不是 WrappedPresent<ChristmasPresent> 的子类型.所以,如果你有一排包裹好的礼物,你就不能在里面放一辆包裹好的玩具车。这很容易迫使您回到仅使用固定的(非类型参数化)WrappedPresent无论如何输入,使问题没有实际意义。泛型和类在 Swift 中并不总是像您想象的那样混合。

如果您有一个实际的问题示例想要用它来解决,那么我建议您在开发论坛上提出来。 Swift 团队 react swift 。

关于generics - 使用 Self 作为通用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27506214/

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