对于Swift的初始化,我有一个非常普遍的问题。与目标C不同,现在可以在函数之外的声明处直接调用init()。
class ViewController: UIViewController {
let myView: UIView = UIView()
override func viewDidLoad() {
super.viewDidLoad()
myView.frame = getFrame()
myView.backgroundColor = UIColor.redColor()
self.view.addSubview(myView)
}
func getFrame() -> CGRect {
return CGRectMake(0, 0, 100, 100)
}
}在目标C中,我将在我的函数中进行初始化。
但是,如果我想调用具有尚未设置的参数的初始化器,该怎么办?例如,我想插入一个正在func()中计算的框架。
class ViewController: UIViewController {
//THIS IS NOT WOKRING
let myView: UIView = UIView(frame: getFrame())
override func viewDidLoad() {
super.viewDidLoad()
myView.backgroundColor = UIColor.redColor()
self.view.addSubview(myView)
}
func getFrame() -> CGRect {
return CGRectMake(0, 0, 100, 100)
}
}我不想在代码中的两个不同的地方进行初始化。初始化有什么通用模式吗?
发布于 2015-04-20 11:24:25
因此,您在快速初始化中的选择是很多的。对于当前的示例,您还不能使用getFrame()方法,因为还没有对self的引用,因为ViewController尚未初始化。相反,您可以使用:
let myView: UIView = UIView(frame: CGRectMake(0, 0, 100, 100))因为这不需要对自我的引用。或者,您也可以使用lazy实例化,它将在self可用后运行(这只能与var而不是let一起使用)。
lazy var myView: UIView = {
return UIView(frame:self.getFrame())
}()为了回答您的问题,在使用UIKit类时,您通常无法控制它们的实例化,您可以继续这样做,就像在目标c中那样,并使用隐式解包选项(以防止每次实例化变量时必须使用!或?,例如:
var myView: UIView!
override func viewDidLoad(){
super.viewDidLoad();
myView = UIView(frame:getFrame())
}但是,这并不适用于let常量,因为需要立即或在对象的构造函数中分配它们。希望这能有所帮助。
https://stackoverflow.com/questions/29745992
复制相似问题