Что, вероятно, происходит, так это то, что во время создания экземпляра и инициализации не гарантируется, что свойства будут инициализированы в том же порядке, в котором вы определили их в коде, поэтому вы не можете инициализировать свойство со значением, полученным из другого свойства.
Мое предложение состоит в том, чтобы переместить инициализацию свойств в метод 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
person
Antonio
schedule
09.07.2014