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

时间:2014-07-09 13:06:32

标签: ios swift constants global

以下是我要做的事情:

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不允许我使用另一个const来定义它们。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

这些竞争对手不了解其他全球竞争因素,因为此时它们尚未初始化。你可以做的是使用计算属性:

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

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

答案 2 :(得分:2)

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

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

附录1 :正如@Yatheesha所建议的那样,在所有属性都已初始化之前,{em}不可用是正确的 - 参见"两阶段初始化"快速书中的一段,在"初始化"

之下

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

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) } ,则必须在每个上复制该代码。在这种情况下,如果您希望避免代码重复,最好使用@ Andy的方法,使用计算属性。

附录2

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

self