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)