当使用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)
}
}
P.S。 CustomClass
无法使用默认初始值设定项,因为它需要查看数据。
答案 0 :(得分:0)
在您的MyVC
中,您可以使用convenience
init
方法初始化let
变量。试试这个,让我知道它是否适合你:
class MyVC: UIViewController {
let viewBasedParam: CustomClass
convenience init() {
self.init(nibName:nil, bundle:nil)
self.viewBasedParam = CustomClass(self.someLabel.text)//else just initialize with empty string here and then assign actual value in viewDidLoad
}
}
答案 1 :(得分:0)
据我所知,解决方案的解决方案可能如下:
class MyVC: UIViewController {
@IBOutlet var someLabel: UILabel!
private var _viewBasedParam: CustomClass? = nil
var viewBasedParam: CustomClass {
get { return self._viewBasedParam! } // always unwrap private optional
set { self._viewBasedParam = newValue }
}
override func viewDidLoad() {
super.viewDidLoad()
self.viewBasedParam = CustomClass(self.someLabel.text)
}
}