2016-09-12 4 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

おそらく、 'repeatedValue'の私の引数は、単一の' Foo'インスタンスを作成し、このインスタンスへのポインタで配列を埋めますか?しかし、それを修正する方法は? – Kevin

+0

「NSlog」の代わりに「print」を使用していないのはなぜですか? –

+0

@RashmiRanjanmallick私はiOS開発でNSLogを使用することに慣れていたので、それは手元の問題に本当に関係していますか? – 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].barmyWrappedIntArray[n].barの同じオブジェクトを参照しています。

コンストラクタが原因です。

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

あなたは、配列の各要素の代わりに、配列の各インデックスのための新しいクラスを作成するためのFoo()参照を繰り返します。

+0

私のユースケースは異なりますが、これは私の問題を再現する書くことができる最小の例です – Kevin

+0

私は私の答えを編集します。 –

+0

すべての要素に対して 'Foo'インスタンスを使って配列を作成するにはどうしたらいいですか?空の配列を作成し、 'Foo'インスタンスを手動で追加する必要がありますか、それとも' init(count:repeatedValue:) 'と同等の要素がありますか? – Kevin

関連する問題