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