Swift: как инициализировать экземпляр класса внутри класса

Я сбит с толку ошибками, возникающими при попытке инициализировать экземпляр массива в классе. Комментарии ниже - это ошибки, которые показывает xcode 6.

Я создал класс. У него есть экземпляр NSMutableArray. Я хочу инициализировать массив (следовательно, вызывая self.instancename.init()). Это жалуется, если я не делаю. Это жалуется, если я делаю.

Фонд импорта

class testclass:NSObject {

    var list_of_things:NSMutableArray;

    init (){  // Designated initializer for 'testclass' cannot delegate (swith self.init);
              // did you means this to be a convenience initializer?
        self.list_of_things.init();
              // 'init' can only refer to the initializers of 'self' or 'super'
        super.init()
              // Initializer cannot both delegate ('self.init') and chain to a superclass
              // initializer ('super.init')
    }
}

4 ответа

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

init () {
    self.list_of_things = NSMutableArray()
    super.init()
}

Также несколько заметок:

  1. Вам не нужны точки с запятой в конце строки (я знаю, что эту привычку трудно сломать)
  2. Вам не нужно наследовать от NSObject
  3. Вы должны предпочесть использовать нативные быстрые массивы (Array) вместо NSMutableArray
  4. Классы всегда должны начинаться с заглавных букв
  5. Имена переменных должны использовать верблюжий регистр вместо подчеркивания

Это будет моя очищенная версия вашего тестового класса:

class TestClass {
    var listOfThings: [AnyObject]

    init () {
        self.listOfThings = []
        super.init()
    }
}

И на самом деле, если вы просто хотите инициализировать пустой массив, вам даже не нужно реализовывать init или явно указывать тип:

class TestClass {
    var listOfThings = []
}

Чтобы вызвать инициализатор другого класса, вы просто вызываете его так:

self.list_of_things = NSMutableArray()

Там нет необходимости неявно вызывать init() функция, это подразумевается при добавлении () к имени класса.

Вы также можете инициализировать его при создании вашей собственности, например так:

var list_of_things:NSMutableArray = NSMutableArray()

Это не то, как вы вызываете init в NSMutableArray.

class testclass:NSObject {

    var list_of_things:NSMutableArray

    init (){ 
        self.list_of_things = NSMutableArray()
        super.init()
    }
}

И избавиться от этих точек с запятой! Что это? прошлая неделя?

Конец в конец ответ. Нет суперкласса, используя массивы Swift, init list_of_things на стороне объявления, в init() нет суперкласса для инициализации.

class testClass {

  var list_of_things = []

  init () { 
  }
}

126> var abc = testClass ()
abc: testClass = {
  list_of_things = @"0 objects"
}
127> abc.list_of_things
$R55: __NSArrayI = @"0 objects"
Другие вопросы по тегам