在Swift中在何处初始化?

在Swift中在何处初始化?,swift,initialization,Swift,Initialization,关于Swift中的初始化,我有一个非常普遍的问题。 与目标C不同,现在可以在我的函数之外的声明处直接调用init() e、 g 在目标C中,我将在函数中进行初始化 但是,如果我想用尚未设置的参数调用初始值设定项,该怎么办? 例如 我想用func()中正在计算的帧初始化 我不想在代码中的两个不同位置进行初始化。是否有初始化的一般模式 因此,您在swift中的初始化选项很多。在当前示例中,您还不能使用方法getFrame(),因为您还没有对self的引用,因为ViewController尚未初始化。

关于Swift中的初始化,我有一个非常普遍的问题。 与目标C不同,现在可以在我的函数之外的声明处直接调用init() e、 g

在目标C中,我将在函数中进行初始化

但是,如果我想用尚未设置的参数调用初始值设定项,该怎么办? 例如 我想用func()中正在计算的帧初始化


我不想在代码中的两个不同位置进行初始化。是否有初始化的一般模式

因此,您在swift中的初始化选项很多。在当前示例中,您还不能使用方法
getFrame()
,因为您还没有对
self
的引用,因为
ViewController
尚未初始化。相反,您可以使用:

let myView: UIView = UIView(frame: CGRectMake(0, 0, 100, 100))
因为这不需要对self的引用。或者,您可以
lazy
实例化,该实例化将在
self
可用后运行(这只能用于
var
而不是
let

lazy var myView: UIView = {
    return UIView(frame:self.getFrame())
}()
为了回答您的问题,当您使用UIKit类时,您通常无法控制其实例化,您可以像在objective c中一样继续这样做,并使用optionals(以防止每次实例化变量时都必须使用
,例如:

var myView: UIView!

override func viewDidLoad(){
    super.viewDidLoad();

    myView = UIView(frame:getFrame())
}

但是,这不适用于
let
常量,因为它们需要立即或在对象的构造函数中分配。希望这能有所帮助。

谢谢你的回答!你会怎么做?没有硬性规定,因为它实际上取决于类的类型。我通常在lin中声明所有常量e(即,
),对带有默认值的值使用
惰性变量
,然后尽可能早地在类的生命周期中初始化所有变量。因此在模型类中(例如,
用户
个人
)在
UIViewController的init和
ViewDiLoad
中。
lazy var myView: UIView = {
    return UIView(frame:self.getFrame())
}()
var myView: UIView!

override func viewDidLoad(){
    super.viewDidLoad();

    myView = UIView(frame:getFrame())
}