swift: 推迟非可选对象初始化
swift: defer non-optional object initialization
使用 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
不能有默认初始化程序,因为它需要来自视图的数据。
在您的 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
}
}
据我所知,解决方法可能如下:
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)
}
}
使用 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
不能有默认初始化程序,因为它需要来自视图的数据。
在您的 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
}
}
据我所知,解决方法可能如下:
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)
}
}