swift全局常量:不能使用另一个常量进行初始化

这是我想要做的:

class ViewController: UIViewController { let screenRect: CGRect = UIScreen.mainScreen().bounds let screenWidth = screenRect.width; let screenHeight = screenRect.height; let screenX = screenRect.origin.x let screenY = screenRect.origin.y override func viewDidLoad() { ...and so on 

Swift允许我声明screenRect

但是,它不允许我使用它来声明任何其他常量。 它向我显示错误: 'ViewController.Type' does not have a member named 'screenRect'

我如何定义这些常量以及为什么swift不允许我使用另一个constnt来定义它们。

这些争议不了解其他全球性的因果,因为它们目前尚未初始化。 你可以做的是使用计算属性:

 class ViewController: UIViewController { var screenRect: CGRect { return UIScreen.mainScreen().bounds } var screenWidth: CGFloat { return self.screenRect.origin.x } } 

这仅适用于vars,因为它的性质。 应根据用例考虑这一点。 如果你经常打电话,它可能不是最明智的表现方式。

在初始化过程完成之前无法访问自身 ,因此它给出错误。

可能发生的情况是,在实例化和初始化期间,不能保证属性的初始化顺序与在代码中定义它们的顺序相同,因此您无法使用从另一个属性检索的值初始化属性。

我的建议是在init()方法中移动属性初始化。

附录1 :正如@Yatheesha所建议的那样, 所有属性都被初始化之前self是不可用的是正确的 – 请参阅快速书中“初始化”下的“两阶段初始化”段落。

在这一行(以及之后的那一行):

 let screenWidth = screenRect.width; 

你暗中使用self

所以正确的方法是使用init() ,如下所示:

 let screenRect: CGRect let screenWidth: NSNumber let screenHeight: NSNumber let screenX: NSNumber let screenY: NSNumber init(coder aDecoder: NSCoder!) { let bounds = UIScreen.mainScreen().bounds screenRect = bounds screenWidth = bounds.width screenHeight = bounds.height screenX = bounds.origin.x screenY = bounds.origin.y super.init(coder:aDecoder) } 

当然,如果有多个指定的init() ,则必须在每个上复制该代码。 在这种情况下,如果您希望避免代码重复,最好使用@ Andy的方法,使用计算属性。

附录2

另一个显而易见的方法(可能是最好的方法)是避免使用self

 let screenRect: CGRect = UIScreen.mainScreen().bounds let screenWidth = UIScreen.mainScreen().bounds.width; let screenHeight = UIScreen.mainScreen().bounds.height; let screenX = UIScreen.mainScreen().bounds.origin.x let screenY = UIScreen.mainScreen().bounds.origin.y