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

swift – init中的自我

发布时间:2020-12-14 05:43:41 所属栏目:百科 来源:网络整理
导读:我想在init参数中使用Self,如下所示: class A { public init(finishBlock: ((_ operation: Self) - Void)? = nil) {...}} 我知道我可以在这个地方使用“A”,但我希望实现这一点,如果某个类继承自A,那么它的初始化程序将知道操作,因为它的类类型而不仅仅是A.
我想在init参数中使用Self,如下所示:
class A {
    public init(finishBlock: ((_ operation: Self) -> Void)? = nil) {...}
}

我知道我可以在这个地方使用“A”,但我希望实现这一点,如果某个类继承自A,那么它的初始化程序将知道操作,因为它的类类型而不仅仅是A.所以例如,如果我写道:

class B: A {
    public init(finishBlock: ((_ operation: Self) -> Void)? = nil) {...}
    public func fooOnlyInB() {}
}

然后我可以使用:

let b = B { (operation) in
    operation.fooOnlyInB()
}

这有点可能吗?

您可以简单地覆盖每个子类的初始化程序,以使用其自己的类型作为操作,而不是在每个初始化程序中使用Self或A.

这是有效的,因为A的初始化器声明操作应该是符合A的类型,并且当您覆盖它时,您可以自由地使用A的子类作为操作.但是,如果将操作更改为不相关的类型(如String或Int),编译器将不会覆盖现有的初始化程序.

首先,用它的init定义A:

class A {
    init(finishBlock: ((_ operation: A) -> Void)?) {...}
}

现在要创建一个子类,您必须使用子类’type as operation来覆盖init.在你对super.init的调用中,强制向你的子类类型进行upcast操作($0),并使用这个类似的操作调用finishBlock.

class B: A {
    override init(finishBlock: ((_ operation: B) -> Void)?) {
        // Perform custom initialisation...
        super.init { finishBlock?($0 as! B) }
    }

    func fooOnlyInB() {
        print("foo")
    }
}

B的初始化现在将B作为操作传递,这意味着您不再需要自己投射它!这要归功于您可以使用更具体的类型覆盖init,在本例中为B.

let b = B { operation in
    operation.fooOnlyInB() // prints "foo"
}

(编辑:李大同)

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

    推荐文章
      热点阅读