gpt4 book ai didi

乘法继承 inits 和 deinits 的 Swift 最佳实践?

转载 作者:搜寻专家 更新时间:2023-11-01 06:38:18 27 4
gpt4 key购买 nike

我有两个类,理想情况下它们的 initsdeinits 中都有代码,例如:

class Tappable {
init() { Registry.register(tappable: self) }
deinit { Registry.deregister(tappable: self) }
}
class Resizable {
init() { Registry.register(resizable: self) }
deinit { Registry.deregister(resizable: self) }
}

理想情况下我会继承两者,例如:

class UIElement: Tappable, Resizable {}

但我当然不能使用 Swift。我目前的解决方案是使一个协议(protocol)成为一个协议(protocol),并在其中添加一条注释以提醒我编写 initdeinit 并调用 Registry,例如:

//: Classes that implememt `Resizable` must call `Registry.register(resizable: self)` in all `init`s and have `deinit { Registry.deregister(resizable: self) }`.
protocol Resizable {}
class UIElement: Tappable, Resizable {
override init() {
super.init()
Registry.register(resizable: self)
}
deinit { Registry.deregister(resizable: self) }
}

有没有更好的办法?

最佳答案

您可以创建一个复合类并将您的注册表类存储为变量,它可能看起来像这样:

protocol Register {
init(_ target: UIElement)
func deregister(target: UIElement)
}
class Tappable: Register {
required init(_ target: UIElement) { Registry.register(tappable: target) }
func deregister(target: UIElement) { Registry.deregister(tappable: target) }
}
class Resizable: Register {
required init(_ target: UIElement) { Registry.register(resizable: target) }
func deregister(target: UIElement) { Registry.deregister(resizable: target) }
}

class UIElement {
var traits: [Register]!
override init() {
self.traits = [Tappable(self), Resizable(self)]
}
deinit {
self.traits.forEach { $0.deregister(self) }
}
}

这样,当对 UIElement 对象调用 deinit 时,UIElement 的所有特征都将被注销。


您可以通过在底部添加以下内容在 Swift Playground 中对此进行测试。这将创建 UIElement 类,让它注册特征,然后释放它并注销它!

var test: UIElement! = UIElement()
test = nil

关于乘法继承 inits 和 deinits 的 Swift 最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38862617/

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