構造体を要素とする配列を初期化する

構造体を要素にもつ配列を初期化する方法をコードで示します。

struct MyStruct{
    var Name: String
    var Age: Int
    var Rate: Double
}

arr.append( MyStruct( Name: "alpha",   Age: 11, Rate: 1.11 ) )
arr.append( MyStruct( Name: "bravo",   Age: 22, Rate: 2.22 ) )
arr.append( MyStruct( Name: "charlie", Age: 33, Rate: 3.33 ) )
arr.append( MyStruct( Name: "delta",   Age: 44, Rate: 4.44 ) )
arr.append( MyStruct( Name: "echo",    Age: 55, Rate: 5.55 ) )

関数化すると下記のようになります。

func SetDataToArray( _ arr: inout [MyStruct] ) -> Bool {

    arr.removeAll()

    arr.append( MyStruct( Name: "alpha",   Age: 11, Rate: 1.11 ) )
    arr.append( MyStruct( Name: "bravo",   Age: 22, Rate: 2.22 ) )
    arr.append( MyStruct( Name: "charlie", Age: 33, Rate: 3.33 ) )
    arr.append( MyStruct( Name: "delta",   Age: 44, Rate: 4.44 ) )
    arr.append( MyStruct( Name: "echo",    Age: 55, Rate: 5.55 ) )

    return true

}

実際にビルドできるコードを下記に示します。

32行目の文字列の書式指定が %@ というのが落とし穴ですね。C言語をやったことがある人は %s と書きたくなってしまいます...

import SwiftUI

struct MyStruct{
    var Name: String
    var Age: Int
    var Rate: Double
}

struct ContentView: View {

    @State var arr000: [MyStruct] = []
    @State var str000: String = ""

    var body: some View {

        VStack {

            Text( str000 )

        }
        .onAppear(){

            // 配列にデータを仕込む.
            _ = SetDataToArray( &arr000 )

            // テキストに表示する文字列を準備する.
            for n in 0 ..< arr000.count {
                let name = arr000[n].Name
                let age  = arr000[n].Age
                let rate = arr000[n].Rate
                // 文字列は %@ で指定する, タブ区切り.
                str000 += String( format: "%@\t%d\t%.2f\n", name, age, rate )
            }

            // 文字列前後の空白と改行を除去する.
            str000 = str000.trimmingCharacters( in: .whitespacesAndNewlines )

        }

    }

    func SetDataToArray( _ arr: inout [MyStruct] ) -> Bool {

        arr.removeAll()

        arr.append( MyStruct( Name: "alpha",   Age: 11, Rate: 1.11 ) )
        arr.append( MyStruct( Name: "bravo",   Age: 22, Rate: 2.22 ) )
        arr.append( MyStruct( Name: "charlie", Age: 33, Rate: 3.33 ) )
        arr.append( MyStruct( Name: "delta",   Age: 44, Rate: 4.44 ) )
        arr.append( MyStruct( Name: "echo",    Age: 55, Rate: 5.55 ) )

        return true

    }

}

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