2015-01-28 4 views
1

Вот мой класс с переопределения initsБыстрая инициализация - Почему вызывается несколько функций init?

class BottomView: UIView { 

    // MARK: - initilization 

    override init() { 
     println("init") 
     super.init() 
     setup() 
    } 

    override init(frame: CGRect) { 
     println("init frame") 
     super.init(frame: frame) 
     setup() 
    } 

    required init(coder aDecoder: NSCoder) { 
     println("init decoder") 
     super.init(coder: aDecoder) 
     setup() 
    } 

    func setup() { 
     println("setup") 
    } 
} 

я инициализировать в моем ViewController со следующим кодом

class ViewController: UIViewController { 

    let bottomView = BottomView() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view, typically from a nib. 

     bottomView.frame = CGRectMake(0.0, self.view.frame.height/2.0, self.view.frame.width, self.view.frame.height/2.0) 
     bottomView.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight | UIViewAutoresizing.FlexibleTopMargin 
     self.view.addSubview(bottomView) 

    } 
} 

И мой выход

init 
init frame 
setup 
setup 

Так что мой вопрос, почему является init (фрейм :), вызываемый?

ответ

3

super.init() звонки self.init(frame:...). По сути, это просто их способ сказать, что frame не является обязательным; если вы его не передадите, они назначают кадр из (0,0,0,0).

func init() { 
    self.init(frame:CGRectMake(0,0,0,0)); 
} 
+0

Хорошо, поэтому я изменил init на удобство переопределения init() и вызвал self.init (frame), а не super.init. Вы знаете, есть ли место, чтобы увидеть, что инициализаторы по умолчанию для каждого класса? Нужно было сделать то же самое с UITableView, но по умолчанию это init (frame: style :) – Sean

+1

Почему вы вообще пытаетесь переопределить 'init()'? Похоже, вы просто хотите поместить свой код 'setup' в' init (frame:) 'и оставить' init() 'делать свою вещь по умолчанию. –

+0

Я думал, что быстрое требует наличия определенных функций init(), даже если они переопределяют другие. Когда я удаляю функцию override init(), я получаю сообщение об ошибке «Отсутствует аргумент для параметра« frame »в вызове» на строке let bottomView = BottomView() – Sean

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