以下是我要做的事情:
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来定义它们。
答案 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