在Swift中初始化的位置?

Mic*_*ael 5 initialization swift

关于Swift中的Initialization,我有一个非常普遍的问题.与Objective 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

在Objective CI中,我将在我的函数中完成初始化.

但是如果我想调用一个没有设置参数的初始化器怎么办?例如,我想用一个在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)
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Bul*_*kel 4

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

let myView: UIView = UIView(frame: CGRectMake(0, 0, 100, 100))
Run Code Online (Sandbox Code Playgroud)

因为这不需要引用 self。或者,您可以lazy实例化,该实例化将在可用后运行self(这只能与varnot一起使用let

lazy var myView: UIView = {
    return UIView(frame:self.getFrame())
}()
Run Code Online (Sandbox Code Playgroud)

为了回答你的问题,当使用 UIKit 类时,你通常无法控制它们的实例化,你可以继续像在 Objective C 中那样做,并使用隐式解包的选项(以防止你每次都必须使用 a!?您实例化一个变量,例如:

var myView: UIView!

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

    myView = UIView(frame:getFrame())
}
Run Code Online (Sandbox Code Playgroud)

然而,这不适用于let常量,因为它们需要立即分配或在对象的构造函数中分配。希望这可以帮助。