2016-09-12 3 views
0

Я пытаюсь научиться быстро. Когда я делаю:Как изменить один элемент в массиве с настраиваемым типом

var myIntArray = [Int](count: 3, repeatedValue: 0) 
myIntArray[0] = 1 
myIntArray[1] = 11 
myIntArray[2] = 111 

// prints "my array: [1, 11, 111]" 
NSLog("my int array: [%d, %d, %d]", myIntArray[0], myIntArray[1], myIntArray[2]) 

Он работает, как ожидалось, но когда я оберните Int в классе, как это:

class Foo { 
    var bar = 0 
} 

var myWrappedIntArray = [Foo](count: 3, repeatedValue: Foo()) 
myWrappedIntArray[0].bar = 1 
myWrappedIntArray[1].bar = 11 
myWrappedIntArray[2].bar = 111 

// prints "my array: [111, 111, 111]" 
NSLog("my wrapped int array: [%d, %d, %d]", myWrappedIntArray[0].bar, myWrappedIntArray[1].bar, myWrappedIntArray[2].bar) 

кажется, изменить весь массив при попытке изменить один элемент. Что я здесь делаю неправильно?

+0

Возможно, мой аргумент для 'repeatValue' создает один экземпляр' Foo' и заполняет массив указателями на этот экземпляр? Но как это исправить? – Kevin

+0

Почему вы не используете «print» вместо «NSlog»? –

+0

@RashmiRanjanmallick Поскольку я привык использовать NSLog в разработке iOS, это действительно актуально для этой проблемы? – Kevin

ответ

1

Для этого случая лучше использовать Struct:

struct Foo { 
    var bar = 0 
} 

var myWrappedIntArray = [Foo](count: 3, repeatedValue: Foo()) 
myWrappedIntArray[0].bar = 1 
myWrappedIntArray[1].bar = 11 
myWrappedIntArray[2].bar = 111 

// prints "my array: [1, 11, 111]" 
print("my wrapped int array: [%d, %d, %d]", myWrappedIntArray[0].bar, myWrappedIntArray[1].bar, myWrappedIntArray[2].bar) 

В случае вы вы работаете со значением, такие как [Foo] ссылочного типа. Но Struct - это значение, набранное и создающее каждый элемент массива уникальным.

Вы ссылаетесь на тот же объект в myWrappedIntArray[0].bar и myWrappedIntArray[n].bar.

Из-за конструктора.

var myWrappedIntArray = [Foo](count: 3, repeatedValue: Foo()) 

Вы повторяете Foo()ссылку для каждого элемента массива вместо создания нового класса для каждого индекса массива.

+0

Мой вариант использования другой, но это самый маленький пример, который я мог бы написать, что воспроизводит мою проблему. – Kevin

+0

я редактирую свой ответ. –

+0

Как создать массив с экземпляром 'Foo' для каждого элемента? Нужно ли создавать массив пустым и добавлять экземпляры 'Foo' вручную или есть эквивалент' init (count: repeatValue:) ', который создает новый экземпляр для каждого элемента? – Kevin

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