構造体のコピーまたは参照のルールについてはまだわかりません。
配列から繰り返しながら構造体オブジェクトを変更したい:たとえば、この場合、背景色を変更したいのですが、コンパイラーが私に叫んでいます
struct Options {
var backgroundColor = UIColor.blackColor()
}
var arrayOfMyStruct = [MyStruct]
...
for obj in arrayOfMyStruct {
obj.backgroundColor = UIColor.redColor() // ! get an error
}
struct
は値型であるため、for
ループではコピーを処理しています。
テストと同じように、これを試すことができます。
struct Options {
var backgroundColor = UIColor.black
}
var arrayOfMyStruct = [Options]()
for (index, _) in arrayOfMyStruct.enumerated() {
arrayOfMyStruct[index].backgroundColor = UIColor.red
}
struct Options {
var backgroundColor = UIColor.blackColor()
}
var arrayOfMyStruct = [Options]()
for (index, _) in enumerate(arrayOfMyStruct) {
arrayOfMyStruct[index].backgroundColor = UIColor.redColor()
}
ここでは、インデックスを列挙し、配列に格納されている値に直接アクセスします。
お役に立てれば。
あなたは使用することができます Array.indices
:
for index in arrayOfMyStruct.indices {
arrayOfMyStruct[index].backgroundColor = UIColor.red
}
for in
ループを使用すると、ローカル変数にコピーされるstruct
オブジェクトを操作しています。また、配列はstruct
オブジェクトなので、配列のすべてのメンバーを変更する場合は、元のオブジェクトの変更されたコピーで満たされた元の配列の変更されたコピーを作成する必要があります。
arrayOfMyStruct = arrayOfMyStruct.map { obj in
var obj = obj
obj.backgroundColor = .red
return obj
}
この配列拡張機能を追加することで簡単にできます。
Swift 4
extension Array {
mutating func mutateEach(by transform: (inout Element) throws -> Void) rethrows {
self = try map { el in
var el = el
try transform(&el)
return el
}
}
}
使用方法
arrayOfMyStruct.mutateEach { obj in
obj.backgroundColor = .red
}
Swift 3の場合、enumerated()
メソッドを使用します。
例えば:
_for (index, _) in arrayOfMyStruct.enumerated() {
arrayOfMyStruct[index].backgroundColor = UIColor.redColor()
}
_
タプルにはオブジェクトのコピーも含まれているため、代わりにfor (index, object)
を使用してオブジェクトに直接アクセスできますが、これはコピーであるため、この方法で配列を変更することはできません。そうするためのindex
。 documentation を直接引用するには:
各アイテムの整数インデックスとその値が必要な場合は、代わりにenumerated()メソッドを使用して配列を反復処理します。配列内の各項目について、enumerated()メソッドは整数と項目で構成されるタプルを返します。