gpt4 book ai didi

swift - 初始化参数中的 self

转载 作者:搜寻专家 更新时间:2023-10-30 23:09:24 24 4
gpt4 key购买 nike

我想像这样在初始化参数中使用 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()
}

这有可能吗?

最佳答案

无需在每个初始化器中使用 SelfA,您可以简单地覆盖每个子类的初始化器以使用其自己的类型作为 operation.

这是有效的,因为 A 的初始化程序声明 operation 应该是符合 A 的类型,并且当您覆盖它时,您有使用 A 的子类作为 operation 的自由。但是,如果将 operation 更改为不相关的类型,例如 StringInt,编译器将不会覆盖现有的初始化程序。

首先,定义A及其init:

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

现在要创建子类,您必须使用子类的类型作为 operation 来覆盖 init。在调用 super.init 时,强制将 operation ($0) 转换为子类的类型,然后调用 finishBlock 使用这个类型转换的 operation

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

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

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

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

关于swift - 初始化参数中的 self ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40055862/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com