2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[Swift] structのMemberwise Initializerを残しつつカスタムのInitializerも実装する方法

Last updated at Posted at 2022-07-01

Swiftの構造体(struct)はInitializerを一つも実装しない場合にMemberwise Initializerと呼ばれるInitializerが自動で生成されます。

Structure types automatically receive a memberwise initializer if they don’t define any of their own custom initializers.



例えば、以下のUser型にInitializerは定義されていませんが、コンパイラが自動でMemberwise Initializerを与えてくれます。

struct User {
    let firstName: String
    let lastName: String
}

よってこのような初期化が可能です。

let user = User(firstName: "Hero", lastName: "Bamboo")

ところで、iOSアプリを実装していると、ドメインを定義したModelから、ビューに表示するためのModelであるViewModelに変換することがあります。

このようなとき、Modelの型をInitializerの引数として受け取るようにすると便利で、以下のような実装をしたりします。

struct UserViewModel {
    let firstName: String
    let lastName: String

    init(model: User) {
        self.firstName = model.firstName
        self.lastName = model.lastName
    }
}

ただし、Memberwise Initializerも残しておきたいとします。

そんなときは、以下のようにカスタムInitializerをextensionに実装しましょう。
こうすると、Memberwise Initializerを残しつつ、カスタムInitializerも実装することができます。

struct UserViewModel {
    let firstName: String
    let lastName: String
}

extension UserViewModel {
    init(model: User) {
        self.firstName = model.firstName
        self.lastName = model.lastName
    }
}

let user1 = UserViewModel(firstName: "Hero", lastName: "Bamboo")

let user2 = UserViewModel(model: user)
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?