web-dev-qa-db-ja.com

Swift-構造体オブジェクトを反復するときに構造体オブジェクトを変更する方法

構造体のコピーまたは参照のルールについてはまだわかりません。

配列から繰り返しながら構造体オブジェクトを変更したい:たとえば、この場合、背景色を変更したいのですが、コンパイラーが私に叫んでいます

struct Options {
  var backgroundColor = UIColor.blackColor()
}

var arrayOfMyStruct = [MyStruct]

...

for obj in arrayOfMyStruct {
  obj.backgroundColor = UIColor.redColor() // ! get an error
}
26
Avner Barr

structは値型であるため、forループではコピーを処理しています。

テストと同じように、これを試すことができます。

スウィフト3:

struct Options {
   var backgroundColor = UIColor.black
}

var arrayOfMyStruct = [Options]()

for (index, _) in arrayOfMyStruct.enumerated() {
   arrayOfMyStruct[index].backgroundColor = UIColor.red
}

スウィフト2:

struct Options {
    var backgroundColor = UIColor.blackColor()
}

var arrayOfMyStruct = [Options]()

for (index, _) in enumerate(arrayOfMyStruct) {
    arrayOfMyStruct[index].backgroundColor = UIColor.redColor() 
}

ここでは、インデックスを列挙し、配列に格納されている値に直接アクセスします。

お役に立てれば。

40
Matteo Piombo

あなたは使用することができます Array.indices

for index in arrayOfMyStruct.indices {
    arrayOfMyStruct[index].backgroundColor = UIColor.red
}
15
emlai

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
}
2
Ondrej Stocek

Swift 3の場合、enumerated()メソッドを使用します。

例えば:

_for (index, _) in arrayOfMyStruct.enumerated() {
  arrayOfMyStruct[index].backgroundColor = UIColor.redColor() 
}
_

タプルにはオブジェクトのコピーも含まれているため、代わりにfor (index, object)を使用してオブジェクトに直接アクセスできますが、これはコピーであるため、この方法で配列を変更することはできません。そうするためのindexdocumentation を直接引用するには:

各アイテムの整数インデックスとその値が必要な場合は、代わりにenumerated()メソッドを使用して配列を反復処理します。配列内の各項目について、enumerated()メソッドは整数と項目で構成されるタプルを返します。

2
ldoogy