2016-07-07 4 views
0

構造体の配列を逆に列挙しています。予想される要素に遭遇したとき、要素の値を更新したいと思います。構造体としての要素型を維持しながらこれを行う方法はありますか?別のクラスにおいて構造体型の配列要素を逆順に列挙しながら更新する

struct MyModel { 
    var name 
    mutating func updateName(newName: String) { 
     self.name = newName 
    } 
} 

、私はそのように宣言私のモデルクラスの配列を持っている:

var array: Array<MyModel> = [] 

私は配列の内容は、> 0のカウントは私がしたいことをいっぱいしました配列の末尾から要素を見つけて、それらが遭遇したときに更新します。

func updateElement() { 
    let newName = "Some Name" 
    let reversedArray = array.reverse() 

    for (index, element) in reversedArray.enumerate() { 
     var el = reversedArray[reversedArray.startIndex.advancedBy(index)] 
     el.updateName(name: newName) 
    } 
    // This does not show the array as having updated contents 
    print(array) 
} 

どのようにして配列を更新することができますか?私は新しい要素を削除したり挿入したりしたくない。

+0

あなたのコードは説明と実際には一致しません。特定の要素を探すのではなく、 'reversedCmdList'が定義されていません。書かれているように、これはすべての要素の名前を "Some Name"に変更しようとしているように思えますが、あなたが意味するものではありません。実際には、いくつかのルールに一致する最後の要素を変更したいだけですか? –

答えて

0

構造体は値型です。つまり、渡されるとコピーされます。構造体の配列は変更できません(配列自体は構造体です)。必要な値を持つ構造体の新しい配列を作成します。それはマッピングです。配列3を更新する方法よりも、「適切な位置に」配列を更新するということはありません。これらは両方とも値です。 (。・スウィフトは、一般的に、すべてのこのコピーはかなり安い作りの最適化を持って、常にではない)

それはあなたが逆の順序でこれをしたい理由は非常に不明瞭だが、ここにあなたがそれを行うだろう方法は次のとおりです。

func updateElement() { 
    let newName = "Some Name" 

    array = array.reverse().map { 
     var element = $0 
     element.updateName(newName) 
     return element 
    }.reverse() 

    print(array) 
} 

これは、配列を逆にし、名前を更新して配列を新しい配列にマップし、それを元に戻して元のプロパティに割り当てます。

これが逆にするのがなぜ便利なのか説明できれば、おそらく何も役に立たないので、おそらくより良い解決策が思い浮かぶでしょう。

+0

私はファイルからエントリのリストを処理していますが、いくつかのエントリは、私が更新する必要がある事実の後に来る追加情報を持っています。事実の後に来る情報は、元のリストの順番です。最後に一致するアイテムを見つけて更新するためのオプションの方法はありますか? –

+0

入力データの簡単な例はありますか?事実の後に来る情報が元のリストの順であると言うと、それらが1対1であることを意味し、別のリストのデータに基づいて1つのリスト内の各レコードを更新していますか?それとも、いくつかの検索がありますか?同じ順序であれば、なぜ最後に一致するアイテムを探しているのですか?この場合「マッチング」とは何ですか? –

+0

入力データは次のようになります。 Info:http://some.domainに対してリクエストが発行されました。com:パラメータ:\ nInfo:http://some.domain.comからの応答、結果=

1

スウィフトArrays - structs - は値の種類です。

elに割り当てられたアイテムは、配列内の元の構造体のコピーであるため、変更後にアイテムを書き戻す必要があります。

... 
for (index, element) in reversedArray.enumerate() { 
    let elIndex = reversedCmdList.startIndex.advancedBy(index) 
    var el = reversedCmdList[elIndex] 
    el.updateName(name: newName) 
    reversedCmdList[elIndex] = el 
} 
... 
0

reversedArrayには元の配列の要素のコピー(構造体がコピーされています)が含まれています。印刷すると(reversedArray)、変更が表示されます。 updateElement()を使用して、配列参照にreverseArrayを割り当てることを検討してください。

関連する問題