LoginSignup
2
5

More than 3 years have passed since last update.

[Swift] 辛くならないイニシャライズ

Posted at

プロパティをそれぞれ代入するのは辛い

辛いイニシャライズがあります。

例えば

class Person {
    var name: String?
    var sex: String?
    init() {}
}

let person = Person()
person.name = "alex"
person.sex = "male"

最初にPersonインスタンスを作ってプロパティを代入していくパターン。プロパティに初期値(ここではnil)を設定してあとで代入します。
例ではname, sex プロパティをそれぞれ代入していますがすべての値を確実に代入するかは開発者の責任になってしまいます。

解決策

すべてのプロパティをセットするにはイニシャライザを作りましょう

class Person {
    let name: String // not optional!
    let sex: String // not optional!
    init(name: String, sex: String) {
        self.name = name
        self.sex = sex
    }
}

let person = Person(name: "alex", sex: "male")

値があとから設定されるとき

でもすべてのほしい値が一度に手に入るとは限らないですよね。
ある人物が病院の受付をする場合を想定します。
namesexの値は事前にわかっていますが、受付番号は病院に行かなければ受け取れません。

class Person {
    let name: String
    let sex: String
   var orderId: Int?
    init(name: String, sex: String) {
        self.name = name
        self.sex = sex
    }
}
let person = Person(name: "alex", sex: "male")
person.orderId = Hosptal.order(person) // あとから設定

解決策

新しい型をつくりましょう。

class Person {
    let name: String
    let sex: String
    init(name: String, sex: String) {
        self.name = name
        self.sex = sex
    }
}

class Patient {
   let name: String
   let sex: String
   let orderId: Int
    init(name: String, sex: String, orderId: Int) {
        self.name = name
        self.sex = sex
        self.orderId = orderId
    }
}

let person = Person(name: "alex", sex: "male")
let patient = Patient(name: person.name, sex: person.sex, Hosptal.order(person)) 

以上です。

2
5
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
5