2017-01-09 2 views
0

Я пытаюсь подклассифицировать UILabel и автоматически генерировать значение для одного из свойств, так что я могу инициализировать с некоторыми значениями и создавать другие случайным образом.Создать значение для свойства класса

Например, здесь я хочу, чтобы иметь возможность создать новый MyLabel, передать значение для labelString и получить значение для labelNumber, генерируемого случайным образом.

class MyLabel: UILabel { 
    var labelString : String! 
    var labelNumber : Int! 

    init(frame: CGRect, labelString: String) { 
     self.labelString = labelString 
     self.labelNumber = createNumber() 
     super.init(frame: frame) 
    } 

    func createNumber() -> Int { 
     return Int(arc4random()) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

Я получаю сообщение об ошибке «Использование« я »в вызове метода до того, как super.init инициализирует себя». Есть ли способ исправить это или лучше использовать шаблон?

Большое спасибо за помощь!

ответ

1

Вы не можете вызвать методы экземпляра от init до тех пор, пока все не будет инициализировано. Один из способов справиться с этим, чтобы сделать createNumberstatic функции, которая не требует класса для инициализации будет называться:

class MyLabel: UILabel { 
    var labelString : String! 
    var labelNumber : Int! 

    init(frame: CGRect, labelString: String) { 
     self.labelString = labelString 
     self.labelNumber = MyLabel.createNumber() 
     super.init(frame: frame) 
    } 

    static func createNumber() -> Int { 
     return Int(arc4random()) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

Другим способом справиться с этим, чтобы переместить инициализацию labelNumber после вызова super.init , Это работает, потому что labelNumber является Необязательно и поэтому изначально присваивается значение nil, которое соответствует требованию, чтобы все свойства подкласса MyLabel были инициализированы перед вызовом init суперкласса.

class MyLabel: UILabel { 
    var labelString : String! 
    var labelNumber : Int! 

    init(frame: CGRect, labelString: String) { 
     self.labelString = labelString 
     super.init(frame: frame) 
     self.labelNumber = createNumber() 
    } 

    func createNumber() -> Int { 
     return Int(arc4random()) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 
+0

Кстати, есть ли конкретная причина, по которой вы хотите, чтобы 'labelString' и' labelNumber' были * Optional * s? По какой причине у вас будет для них «нуль», и чтение их в этом случае потерпит крах с тех пор, как вы их сделали * Неявно Unwrapped Optional * s. – vacawama

+0

Выполнение параметров optionals вышло из следующего урока (вслепую), но в моем случае это не обязательно. Поэтому второе решение не работает здесь, когда они не являются опциями, но функция Static идеальна! Спасибо, что помогли мне разобраться. – enesefuu

+0

Добро пожаловать. Вы можете заставить второе решение работать с непараллельными, объявив его как 'var labelNumber = 0' – vacawama

Смежные вопросы