Я хочу настроить переменную с помощью let
, чтобы ее не было необязательно, со временем не будет изменяться и не требует беспорядочного доступа для доступа каждый раз. Я знаю, что могу законно установить его, но только внутри одного из методов init
. Проблема в том, что Swift требует переопределения инициализатора init(coder aDecoder: NSCoder)
. Однако у меня никогда не было приложения, которое когда-либо вызывало этот инициализатор. Его всегда вызывается инициализатор init(frame: CGRect)
. Так что, если бы мне не пришлось переопределять init(coder aDecoder: NSCoder)
, я бы просто сделал self.imageView = UIImageView.new()
в init(frame: CGRect)
, и я бы это сделал, но компилятор жалуется, что он не установлен и в другом init. Я попытался сделать метод sharedInit()
, который вызывается из обоих inits, но компилятор не позволяет мне устанавливать imageView
, поскольку он читается только за пределами методов init. Как вы должны это сделать, не выполняя весь свой init дважды непосредственно в методах init?Как инициализировать переменную let с помощью общего метода init?
class SuperCoolView : UIView {
let imageView: UIImageView
required init(coder aDecoder: NSCoder) {
sharedInit()
super.init(coder: aDecoder)
}
override init(frame: CGRect) {
sharedInit()
super.init(frame: frame)
}
func sharedInit() {
self.imageView = UIImageView.new()
// Other similar shared init
}
}
Swift 1.2 своего рода исправляет эту проблему (вы можете установить переменную LET где угодно, но, конечно, только один раз ..). – Ron
Я делаю это в Xcode 6.3b3, поэтому я использую Swift 1.2, и я получаю ошибки. – jamone
Возможный дубликат [Как реализовать два входа с одним контентом без дублирования кода в Swift?] (Http://stackoverflow.com/q/24023412/1445366). См. [Этот ответ в частности] (http://stackoverflow.com/a/24051352/1445366) - вы можете комбинировать инициализацию свойств на основе замыкания с помощью функции commonInit(). –