Error[8]: Undefined offset: 6, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述我想在init参数中使用Self,如下所示: class A { public init(finishBlock: ((_ operation: Self) -> Void)? = nil) {...}} 我知道我可以在这个地方使用“A”,但我希望实现这一点,如果某个类继承自A,那么它的初始化程序将知道 *** 作,因为它的类类型而不仅仅是A.所以例如,如果我写道: class B: 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?(
let b = B { operation in    operation.fooOnlyInB() // prints "foo"}
as! B) } } func fooOnlyInB() { print("foo") }}

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

[+++] 总结

以上是内存溢出为你收集整理的swift – init中的自我全部内容,希望文章能够帮你解决swift – init中的自我所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
swift – init中的自我_app_内存溢出

swift – init中的自我

swift – init中的自我,第1张

概述我想在init参数中使用Self,如下所示: class A { public init(finishBlock: ((_ operation: Self) -> Void)? = nil) {...}} 我知道我可以在这个地方使用“A”,但我希望实现这一点,如果某个类继承自A,那么它的初始化程序将知道 *** 作,因为它的类类型而不仅仅是A.所以例如,如果我写道: class B: 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?(
let b = B { operation in    operation.fooOnlyInB() // prints "foo"}
as! B) } } func fooOnlyInB() { print("foo") }}

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

总结

以上是内存溢出为你收集整理的swift – init中的自我全部内容,希望文章能够帮你解决swift – init中的自我所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1047157.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存