2014-11-26 6 views
2

Я пытаюсь добавить простой инициализатор в UIViewController в Swift. До сих пор это было очень неприятно ...Сумасшедшее поведение с установками UIViewController в Swift

Сначала я пытался добавить его в качестве удобства инициализации:

class ImageViewController: UIViewController { 

    var model: UIImage 

    convenience init(model: UIImage){ 

     self.init(nibName: nil, bundle: nil) 
     self.model = model 

    } 
.... 

Если я сделаю это, компилятор заставляет меня реализовать необходимые init(coder aDecoder: NSCoder). Я проверил определение класса UIViewController, и такого требования нет, но в любом случае.

Чтобы ухудшить ситуацию, компилятор жалуется, что вызов self.init(nibName: nil, bundle: nil) имеет ошибочный дополнительный аргумент в bundle:. Опять же, я проверил определение класса, и для сигнатуры инициализатора требуются оба параметра.

Поэтому я решил сделать это назначенным инициализацией. Это не то, что я хочу, поскольку я не хочу потерять все инициализаторы суперкласса.

Теперь, похоже, он доволен вызовом self.init(nibName: nil, bundle: nil), но он по-прежнему настаивает на том, чтобы я реализовал init(coder aDecoder: NSCoder).

Любые идеи о том, что происходит? Я не могу сделать головы или хвосты этого ...

ответ

3

сообщения об ошибках, действительно сбивает с толку, но я думаю, что они исходят из того, что если model свойство не имеет значения по умолчанию, то требуемые Инициализаторы больше не унаследованный от суперкласса. С дополнительным (или неявно развернутого по желанию) имущества (который имеет значение по умолчанию nil) код компилируется:

class ImageViewController: UIViewController { 

    var model: UIImage! 

    convenience init(model: UIImage) { 
     self.init(nibName: nil, bundle: nil) 
     self.model = model 
    } 
} 
1

Если вы не хотите, чтобы model свойство быть необязательным, не делайте это необязательно. Конечно, это сука должна реализовать initWithCoder:, но лучше иметь надежный, безопасный код.

class ImageViewController: UIViewController { 
    var model: UIImage 

    init(model: UIImage) { 
     self.model = model 
     super.init(nibName: nil, bundle: nil) 
    } 

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

Это гарантирует, что единственный способ экземпляр ImageViewController может быть создано это вызов initWithModel: и, следовательно, гарантирует, что model всегда будет иметь nonoptional значение.

Возможно, в будущем Apple добавит удобный способ сделать это, но на данный момент я должен пожертвовать удобством для контроля.

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