自己可以用作一种方法的返回类型:
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团队知道,有一天我肯定会有强大的方法.但今天不是那一天.有很多事情你想表达的方法,你不能.然而,您所需要的一切都可以轻松完成.
原文链接:https://www.f2er.com/swift/318904.htmlclass 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团队非常敏感.