_mitty
@_mitty

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

SwiftUIで配列に要素を追加し、追加した要素を表示する方法

解決したいこと

SwiftUIで、配列に要素を追加し、追加した要素を表示したい。

Swift勉強中の初心者です。
newarray1(以下ソースコードで宣言している配列の名称)に対し、
.append()メソッドを使用して配列の最後に要素を追加し、追加した要素を表示しようとしたところ、
以下のエラーが発生しました。

解決方法のご教授を、よろしくお願いします。

※補足です〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
以前にも似たような質問(https://qiita.com/_mittttz/questions/73930df1cf1bd9dca9f6)
をさせていただき、()型やsubscriptについて触れながら回答いただいたのですが、まだよく理解できておりません。

ビューの表示に関すること以外(例えば本質問では、appendメソッドを使用して配列に要素を追加する処理)
は、var body: some View {}の外側に書くべきでしょうか。
その場合、どのように書くのが一般的なのでしょうか。
※〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

発生している問題・エラー1

var newarray1 = testarray1.append("g")に対して、以下の警告文が出ています

Variable 'newarray1' inferred to have type '()', which may be unexpected

発生している問題・エラー2

Text("(newarray1[6])")に対して、以下のエラー文が出ています

Value of type '()' has no subscripts

該当するソースコード

//Xcodeのバージョン Version 12.3 (12C33)
//Swiftのバージョン Apple Swift version 5.3.2

import SwiftUI

var testarray1: [String] = ["c", "a", "d", "b", "e", "f"]


struct ContentView: View {
    var body: some View {

        //配列の最後に要素を追加(.append()メソッドを利用して追加)
        var newarray1 = testarray1.append("g")
        //追加した要素を確認したいので、5+1個目の要素を呼び出して表示
        Text("\(newarray1[6])")

    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
0

1Answer

まず補足部分に回答させていただきます。

「appendメソッドを使用して配列に要素を追加する処理」のような「データそのものを変更するような処理」は、「行いたいタイミング」において行います。例えば「初期化の時」に処理をしたい場合はinitを用います。「ボタンを押した時」に処理したい場合はButtonactionに処理を書きます。「ビューが現れたとき」に処理をしたい場合は.onAppearなどを用います。これらについては検索してみれば使い方などが分かるかと思います。bodyの中に書いた処理は「bodyが用いられるタイミング=描画のタイミング」で行われますが、このタイミングで何かをしたいというのは、私はあまり経験したことのない状況です。

ですので「処理を一般的にどこに書くべきか」は「どのタイミングでデータを変更したいのか」によります。

次に問題になっているエラーですが、これは前回の質問への回答で言及した通りappendVoidを返すメソッドであることによるエラーです。おそらく関数の動作について混乱があるのだと思いますが、sortappendは値自身を変更するメソッドです。つまりこれらのメソッドを呼び出すとtestarray1が変更され、Voidが返ってきます。一方sortedfilterは値から新たな値を生成して返すメソッドです。つまりtestarray1はそのままに、それに基づいて別の新しい値を生成して返してきます。

どのタイミングで動作して欲しいのかについての記述がないため今回のコードで何をしたいのかわかりませんが、ただ"g"という値を追加した配列を取得したいのであれば次のようにすればいいと思います。

    var body: some View {
        //配列の最後に"g"を加えた新しい配列を作る
        var newarray1 = testarray1 + ["g"]
        //追加した要素を確認したいので、5+1個目の要素を呼び出して表示
        Text("\(newarray1[6])")
    }

この場合testarray1そのものは変更されていないことに注意してください。

間違っていたら申し訳ないのですが、関数の動作を目で確認する目的でSwiftUIを用いているなら、また別の答えになるので、おっしゃってください。

1Like

Comments

  1. @_mitty

    Questioner

    重ね重ね、ご回答ありがとうございます。
    .append()も、.sort()も、描画のタイミングではなく、ユーザーが操作したタイミングで行いたい処理ですね。。
    実際にButtonのaction{}の中に書くと、.append()も.sort()もエラーなく実行できたので、納得です。
    また、値自身を変更するメソッドと、値から新たな値を生成するメソッドの違いに関しては、私の中で違いを整理できていなかったことが混乱していた要因だったと気づき、腹に落ちました。
    全体的にとても参考になりました。
    ありがとうございます。

Your answer might help someone💌