2015-01-01 2 views
0

У меня возникли проблемы с синтаксисом здесь. В основном я создал простой класс и надеюсь добавить объект этого класса в массив.Добавить объект класса в массив

class simpleClass { 
    var aNum = Int() 
    var aWord = String() 
    init(thisNum:Int,thisString:String) 
    { 
     aNum = thisNum 
     aWord = thisString 
    } 
} 

var aObj:simpleClass 
var aArray:Array<simpleClass> 
aObj = simpleClass(thisNum:12,thisString:"Test") 
aArray.append(aObj) 

Как вы видите, я создал объект simpleClass и пытаюсь добавить его в массив типа simpleClass. Тем не менее, я получаю сообщение об ошибке говорящее

передается по ссылке перед тем, как инициализируется

Я предполагаю, что я должен быть что-то в синтаксисе отсутствует. Надеюсь, кто-то может указать на мою ошибку.

спасибо, sweekim

+0

Вы забыли инициализировать массив. var aArray: Array = Array() – rakeshbs

ответ

0

Измените эту строку:

var aArray:Array<simpleClass> 

Для этого:

var aArray:Array<simpleClass> = [] 

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

+0

Я не знаю, это сообщение немного вводит в заблуждение, особенно «по ссылке» для типа значения. Обычно это было бы более очевидным, как «aArray, используемый до инициализации» –

+0

@AirspeedVelocity «Ссылка» - это потому, что 'append' является' mutating'; он _is_ по ссылке таким же образом, что 'inout' является ссылкой. – matt

1

Необходимо присвоить массив переменной массива.

var aArray:Array<simpleClass> = [] 

Или, если вы предпочитаете,

var aArray = Array<simpleClass>() 

Или даже (мое предпочтение)

var aArray: [simpleClass] = [] 

Или

var aArray = [simpleClass]() 

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

var aArray = [simpleClass(thisNum:12,thisString:"Test")] 

вместо целых 4 последних строчек.

Кстати, вы могли бы найти лучше объявить класс как это:

class simpleClass { 
    var aNum: Int 
    var aWord: String 
    init(thisNum:Int,thisString:String) { 
     aNum = thisNum 
     aWord = thisString 
    } 
} 

Это типы aNum и aWord, но не присваивает им значения, так как вы тогда сделать это в методе init. Причина в том, что если вы когда-либо забыли присвоить значение в init, компилятор предупредит вас, а если вы по умолчанию их не сделаете. Все нормально, но вместо этого они не включают их в метод init - тот или другой лучше, оба немного избыточны и могут привести к ошибкам.

+0

Вы все еще не показали ему тот, который я бы использовал. :) – matt

+0

Я, вероятно, отредактировал его сейчас. Лично я не забочусь об этом, не знаю, почему он так популярен :) –

+0

Большое спасибо за советы – sweekim

0

Также, я думаю, вы не совсем правильно заявили свой экземпляр simpleClass. Я сделал это, чтобы отключить ошибки:

var aArray:Array<simpleClass> = [] 
let aObj:simpleClass = simpleClass(thisNum:12,thisString:"Test") 
aArray.append(aObj) 

Обратите внимание, как создается экземпляр simpleClass.

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