我想在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" }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。