Това, което вероятно се случва, е, че по време на инстанциране и инициализация не е гарантирано, че свойствата се инициализират в същия ред, както сте ги дефинирали в кода, така че не можете да инициализирате свойство със стойност, извлечена от друго свойство.
Моето предложение е да преместите инициализациите на свойството в метода init()
.
Допълнение 1: както е предложено от @Yatheesha, правилно е да се каже, че self
не е наличен докато всички свойства не бъдат инициализирани - вижте параграфа „Двуфазна инициализация“ в swift книга, под "Инициализация"
В този ред (както и в тези след него):
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