gpt4 book ai didi

ios - 在 Swift 中将一个默认属性值传递给另一个

转载 作者:行者123 更新时间:2023-11-29 02:31:34 24 4
gpt4 key购买 nike

假设我想做如下的事情。我有一个自定义的 UIView 子类,有几个属性。我想从另一个先前的属性初始化这些属性之一。

class MyView :UIView {

var driver = HumanDriver()

var car = Car(driver: driver)
var plane = Plane(driver: driver)
var train = Train(driver: driver)
var spaceship = Spaceship(driver: driver)

override init() {
super.init()
}
required init(coder aDecoder: NSCoder) {
super.init(coder:aDecoder)
}
override init(frame: CGRect) {
super.init(frame: frame)
}
}

此代码将出现错误:“MyView.Type”没有名为“driver”的成员。因此,解决此问题的一个明显尝试是在初始化程序中定义默认值。如果只有一个初始化程序,这很好。但是如果我们有几个呢?那么我可以尝试在单个设置函数中收集通用代码,如下所示:

class MyView :UIView {

var driver = HumanDriver()

var car
var plane
var train
var spaceship

override init() {
setupMyView()
super.init()
}
required init(coder aDecoder: NSCoder) {
setupMyView()
super.init(coder:aDecoder)
}
override init(frame: CGRect) {
setupMyView()
super.init(frame: frame)
}

func setupMyView() {
car = Car(driver: driver)
plane = Plane(driver: driver)
train = Train(driver: driver)
spaceship = Spaceship(driver: driver)
}

}

但这也会导致错误,这次:'self' used before super.init call。这是可以理解的,因为我们在调用 init 之前使用 self。

有什么好的解决办法吗?显然我可以只使用隐式展开的可选值,但似乎应该有更好的方法!

最佳答案

如何覆盖驱动程序 setter 并在其中设置属性?像这样:

class MyView :UIView {

var driver:HumanDriver = HumanDriver() {
didSet{
car = Car(driver: driver)
plane = Plane(driver: driver)
train = Train(driver: driver)
spaceship = Spaceship(driver: driver)
}
}

var car: Car?
var plane: Plane?
var train: Train?
var spaceship: Spaceship?
}

通过这种方式,您可以保持初始化程序的整洁。顺便说一句,您可能必须至少添加所需的初始化程序,但这是另外一回事。我认为这是您最终可能希望得到的最干净的解决方案之一。

希望这对您有所帮助。

关于ios - 在 Swift 中将一个默认属性值传递给另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26793798/

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