Подтвердить что ты не робот

Подкласс Swift - как переопределить Init()

У меня есть следующий класс с методом init:

class user {
  var name:String
  var address:String

  init(nm: String, ad: String) {
    name = nm
    address = ad
  }
}

Я пытаюсь подклассифицировать этот класс, но я продолжаю получать ошибки в части super.init():

class registeredUser : user {
     var numberPriorVisits: Int

     // This is where things start to go wrong - as soon as I type 'init' it 
     // wants to autocomplete it for me with all of the superclass' arguments, 
     // and I'm not sure if those should go in there or not:
     init(nm: String, ad: String) {  
        // And here I get errors:
        super.init(nm: String, ad: String) 

     // etc....

Apple iBook имеет примеры подклассификации, но не те классы объектов, которые имеют метод init() с любыми фактическими аргументами в нем. Все их init не имеют аргументов.

Итак, как вы это делаете?

4b9b3361

Ответ 1

В дополнение к ответу Чака, вы также должны инициализировать свое новое введенное свойство перед вызовом super.init

Назначенный инициализатор должен гарантировать, что все свойства введенные его классом, инициализируются до того, как он делегирует до инициализатор суперкласса. (Язык быстрого языка → Руководство по языку → Инициализация)

Таким образом, чтобы заставить его работать:

init(nm: String, ad: String) {
    numberPriorVisits = 0  
    super.init(nm: nm, ad: ad) 
}

Эта простая инициализация в ноль могла быть выполнена путем установки значения по умолчанию для свойства тоже. Он также рекомендовал сделать это:

var numberPriorVisits: Int = 0

Если вы не хотите такого значения по умолчанию, имеет смысл расширить ваш инициализатор, чтобы также установить новое значение для нового свойства:

init(name: String, ads: String, numberPriorVisits: Int) {
    self.numberPriorVisits = numberPriorVisits
    super.init(nm: name, ad: ads)
}

Ответ 2

В swift 2.0 и более поздних версиях он работает так (все случаи)

init(newString:String) {
    super.init(string:newString)
    // Designed initialiser 
}
override init(someString: String) {
    super.init(mainString: someString)
    // Override initialiser when subclass some class 
}
required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
    // Some boilerplate code to handle error (needed when override)
}
convenience init(newString:String, withParameters:Dictionary<String,String>) {
    self.init(someString:newString)
    //Convenience initialiser 
}

Ответ 4

Попробовали ли вы установить значение numberPriorVisits и изменить типы вызовов для супер

class user {
    var name:String
    var address:String

    init(nm: String, ad: String) {
        name = nm
        address = ad
    }
}


class registeredUser : user {
    var numberPriorVisits: Int;

    init(nm: String, ad: String) {
        self.numberPriorVisits = 0;
        super.init(nm: nm, ad: ad)
    }
}