泛型 – 使用自身作为通用类型

前端之家收集整理的这篇文章主要介绍了泛型 – 使用自身作为通用类型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
自己可以用作一种方法的返回类型:
func doSomething() -> Self {}

使用Self作为这样的泛型吗?

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

这将是很好,如果我可以子类ChristmasPresent,并让它有一个包装函数,返回一个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中所想像的那样混合.

如果你有一个问题的实际例子,你想要解决这个问题,那么我建议把它放在dev论坛上. Swift团队非常敏感.

原文链接:https://www.f2er.com/swift/318904.html

猜你在找的Swift相关文章