微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

因此,您在swift中初始化的选择很多.在您当前的示例中,您无法使用方法getFrame(),因为您还没有对self的引用,因为ViewController尚未初始化.相反,你可以使用:
let myView: UIView = UIView(frame: CGRectMake(0,100))

因为这不需要引用自我.或者你可以懒惰实例化,它将在self可用后运行(这只能用于var not 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常量,因为它们需要立即分配或在对象的构造函数中分配.希望这可以帮助.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐