Как правильно создать инициализаторы в Swift? - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть класс NewFormView: UIView, внутри которого у меня есть

var viewModel: NewFormViewModel

, где NewFormViewModel имеет инициализатор:

var user: Users
init(for user: Users) {
    self.user = user
}

Итак, я хочу: когда я инициализирую свой NewFormView, чтобы передать ему user: Users и инициализировать мой viewModel с ним. Как:

let newFormView = NewProfileFormView(user: user)

но когда я пытаюсь создать инициализаторы для NewProfileView:

init(user: Users) {
    super.init(user: user)
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

Я получаю ошибку Argument labels '(user:)' do not match any available overloads. Я пробовал также с convenience init, но получил другую ошибку. Я думаю, что моя проблема в неправильном мышлении. Не могли бы вы объяснить мне, как я могу решить эту проблему и можете позвонить:

let newFormView = NewProfileFormView(user: user)

Ответы [ 4 ]

0 голосов
/ 29 апреля 2018

Проблема в том, как вы звоните

super.init(user: user)

Ваш инициализатор NewFormViewModel имеет подпись init (для :), поэтому вы должны изменить свой код следующим образом:

super.init(for: user)
0 голосов
/ 29 апреля 2018

Вам нужно будет создать еще один init, где вы передадите и пользователя, и фрейм, например,

    class Form: UIView {
    private var model: FormModel!
    private var user: User!

     init(user: User, frame: CGRect) {
        self.user = user
        self.model = FormModel.init(user: user)
        super.init(frame: frame) //<-- since your view is derived from UIView, you need to set your base init 
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

}
0 голосов
/ 29 апреля 2018
 struct Users {
     var placeholder: String?
 }

 class NewFormView: UIView {
     var viewModel: NewFormViewModel

     init(user: Users, frame: CGRect) {
         self.viewModel = NewFormViewModel(for: user)
         super.init(frame: frame)
     }

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

 class NewFormViewModel {
     var user: Users

     init (for user: Users) {
         self.user = user
     }
 }

Пример использования:

let formView = NewFormView.init(user: Users.init(placeholder: ""), frame: CGRect())

Там, где пользователь следует вашим правильным инициализаторам для вашей структуры / класса Users, и вы даете фрейму правильные размеры, которые, как вы ожидаете, будут отображаться.

0 голосов
/ 29 апреля 2018

Если вы используете файл .Xib для просмотра, вы можете инициализировать UIView следующим образом:

var user: Users?

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    commonInit()
}

override init(frame: CGRect, user: Users) {
    super.init(frame: frame)
    commonInit()
    self.user = user
}

private func commonInit() {
    Bundle.main.loadNibNamed("yourXibName", owner: self, options: nil)
    addSubview(contentView)
    contentView.frame = self.bounds
    contentView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
}

, что contentView является @IBOutlet основного представления в вашем классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...