【发布时间】:2016-07-26 17:15:15
【问题描述】:
使用 CocoaTouch 拨号时,经常会出现 UIView(Controller) 子类属性无法在init 方法中初始化(例如,我们需要已加载视图),但逻辑上它们是非可选的,甚至是非 var .在这种情况下,该属性必须是可选的,才能在没有错误的情况下进行编译,这看起来很丑陋 - 代码使用 ! 来实现。
有什么办法可以解决这个问题吗?我会想象一些延迟初始化。如果此类属性可以在没有初始值的情况下编译,并且如果在初始化之前访问它,则在运行时崩溃。
一些描述问题的代码示例:
class MyVC: UIViewController {
@IBOutlet var someLabel: UILabel!
let viewBasedParam: CustomClass // how to keep it non-optional if it can be initialized after view has been loaded?
override func viewDidLoad() {
super.viewDidLoad()
self.viewBasedParam = CustomClass(self.someLabel.text)
}
}
附: CustomClass 不能有默认初始化程序,因为它需要视图中的数据。
【问题讨论】:
-
你可以试试
lazy。 -
你也可以使用builder模式
-
@ILikeTau,是的,可能,但这种方法非常有限——我必须为属性编写专用的初始化代码(例如
lazy var viewBasedParam = self.specialMethodToInitThisParam())。我正在寻找能够从任何地方分配初始值的通用解决方案,即使是通过外部代码。 -
您应该使用隐式展开的选项,就像您使用
UILabel!一样。
标签: ios swift initialization optional-parameters