【问题标题】:Where to initialize in Swift?Swift 在哪里初始化?
【发布时间】:2015-06-27 01:36:07
【问题描述】:

我对 Swift 中的初始化有一个非常普遍的问题。 与 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)
    }
}

在 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)
    }
}

我不想在代码中的两个不同位置进行初始化。初始化有什么通用模式吗?

【问题讨论】:

    标签: swift initialization


    【解决方案1】:

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

    let myView: UIView = UIView(frame: CGRectMake(0, 0, 100, 100))
    

    因为这不需要引用 self.或者,您可以在self 可用后运行lazy 实例化(这只能用于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 常量,因为它们需要立即赋值或在对象的构造函数中赋值。希望这会有所帮助。

    【讨论】:

    • 感谢您的出色回答!你会怎么做?
    • 没有硬性规定,因为它实际上取决于类的类型。说我通常在行中声明所有常量(即let),将lazy var 用于具有默认值的值,然后在类的生命周期中尽早初始化所有变量。所以在模型类(例如 UserPerson)中 init 和 UIViewControllerviewDidLoad 中。
    猜你喜欢
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 2016-08-16
    • 1970-01-01
    相关资源
    最近更新 更多