加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 05:21:08 所属栏目:百科 来源:网络整理
导读:自己可以用作一种方法的返回类型: func doSomething() - Self {} 使用Self作为这样的泛型吗? func doSomething() - WrapperSelf {} 例 这将是很好,如果我可以子类ChristmasPresent,并让它有一个包装函数,返回一个WrappedPresent与通用集到任何子类. class
自己可以用作一种方法的返回类型:
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团队非常敏感.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读