我对Swift中的初始化有一个非常普遍的问题。 与Objective C不同,现在可以直接在我的函数之外的声明中调用init(): e.g。
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)
}
}
在Objective 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)
}
}
我不想在代码中的两个不同位置进行初始化。初始化是否有任何一般模式?
答案 0 :(得分:4)
因此,您在swift中初始化的选择很多。对于您当前的示例,您还不能使用方法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中一样,并使用implicitly unwrapped选项(以防止你有每次实例化变量时使用!
或?
,例如:
var myView: UIView!
override func viewDidLoad(){
super.viewDidLoad();
myView = UIView(frame:getFrame())
}
然而,这不适用于let
常量,因为它们需要立即分配或在对象的构造函数中分配。希望这会有所帮助。