首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在哪里初始化Swift?

在哪里初始化Swift?
EN

Stack Overflow用户
提问于 2015-04-20 11:00:00
回答 1查看 160关注 0票数 5

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

代码语言:javascript
复制
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)
    }
}

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

但是,如果我想调用具有尚未设置的参数的初始化器,该怎么办?例如,我想插入一个正在func()中计算的框架。

代码语言:javascript
复制
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)
    }
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-20 11:24:25

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

代码语言:javascript
复制
let myView: UIView = UIView(frame: CGRectMake(0, 0, 100, 100))

因为这不需要对自我的引用。或者,您也可以使用lazy实例化,它将在self可用后运行(这只能与var而不是let一起使用)。

代码语言:javascript
复制
lazy var myView: UIView = {
    return UIView(frame:self.getFrame())
}()

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

代码语言:javascript
复制
var myView: UIView!

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

    myView = UIView(frame:getFrame())
}

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29745992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档