🪶

SwiftUIで構造体を配列に格納した書き方 [] () とは?

2024/05/04に公開

Tips💡

Swiftのstructをarrayに格納する書き方で、[User()][User]() の書き方の違いがわからなかった🤦

試しにコードを書いてみて実行してみると、[User()]はインスタンスが2個生成されて、[User]()はインスタンスが1個しか生成されなかった???

struct UserState {
    var id: String
    var name: String
}

struct AnimalState {
    var id: String?
    var name: String?
}

var userState = [UserState]()
userState.append(UserState(id: "1111",  name: "icchy"))
print(userState)
print(userState.count)

var animalState = [AnimalState()]
animalState.append(AnimalState(id: "2222", name: "Dog"))
print(animalState)
print(animalState.count)

Github Copilotに聞いてみた

AnimalStateの配列animalStateが初期化される際に、AnimalState()という形でデフォルトのインスタンスが生成されています。そのため、animalState.append(AnimalState(id: "2222", name: "Dog"))を実行した後でも、配列には2つのインスタンスが存在します。

配列を初期化する際には、[]を使用して空の配列を作成することが一般的です。以下のように修正すると、期待通りの結果が得られます。

nil許容しなくてもエラー出ないので、構造体のプロパティの?は消します

struct AnimalState {
    var id: String
    var name: String
}

var animalState = [AnimalState]()
animalState.append(AnimalState(id: "2222", name: "Dog"))
print(animalState)
print(animalState.count)

[修正後の実行結果]

最後に

Swiftのコード書くの慣れてないので、独特な構文を理解しようと毎日励んでおります🏃‍♀️
ログ出すまで、インスタンスが1回なのか2回なのか生成される違い気づかなかったです。

Discussion