失敗可能イニシャライザ / required init
| 対応: | Swift 1.0(2014) |
|---|
Swiftの失敗可能イニシャライザ(『init?』)は初期化に失敗したときに nil を返せるイニシャライザです。バリデーションが必要な型の初期化に役立ちます。
構文
struct / class 型名 {
// 失敗可能イニシャライザ(Optional を返す)
init?(引数: 型) {
guard 条件 else { return nil } // 失敗時は nil を返す
// 初期化処理
}
// 強制失敗可能イニシャライザ(失敗時にクラッシュ)
init!(引数: 型) {
// ...
}
// 必須イニシャライザ(サブクラスで実装必須)
required init(引数: 型) {
// ...
}
// コンビニエンスイニシャライザ(クラスのみ)
convenience init(省略引数: 型) {
self.init(完全引数: ...) // 指定イニシャライザを呼ぶ
}
}
構文一覧
| 構文 | 概要 |
|---|---|
| init?(...) | 失敗可能イニシャライザです。失敗時は nil を返します。 |
| init!(...) | 強制失敗可能イニシャライザです。失敗時は実行時クラッシュします。 |
| required init(...) | すべてのサブクラスで実装を必須とするイニシャライザです。 |
| convenience init(...) | クラスのみ使えるコンビニエンスイニシャライザです。 |
サンプルコード
sample_failable_initializer.swift
// 失敗可能イニシャライザを持つ struct
struct Temperature {
let celsius: Double
// 絶対零度より低い温度は作れない
init?(celsius: Double) {
guard celsius >= -273.15 else {
return nil
}
self.celsius = celsius
}
}
// 成功例
if let temp = Temperature(celsius: 25.0) {
print("温度: \(temp.celsius)°C")
}
// 失敗例
if Temperature(celsius: -300.0) == nil {
print("無効な温度です")
}
// クラスでの required と convenience
class LabMember {
var name: String
var labNumber: Int
// 指定イニシャライザ
init(name: String, labNumber: Int) {
self.name = name
self.labNumber = labNumber
}
// コンビニエンスイニシャライザ(指定イニシャライザを呼ぶ)
convenience init(name: String) {
self.init(name: name, labNumber: 999)
}
// サブクラスで必須実装
required init(json: [String: Any]) {
self.name = json["name"] as? String ?? "Unknown"
self.labNumber = json["labNumber"] as? Int ?? 0
}
}
class FutureGadgetLabMember: LabMember {
required init(json: [String: Any]) {
super.init(json: json)
}
}
let mayuri = LabMember(name: "椎名まゆり")
print("\(mayuri.name): Lab #\(mayuri.labNumber)")
let okabe = FutureGadgetLabMember(json: ["name": "岡部倫太郎", "labNumber": 1])
print("\(okabe.name): Lab #\(okabe.labNumber)")
swift failable_initializer.swift 温度: 25.0°C 無効な温度です 椎名まゆり: Lab #999 岡部倫太郎: Lab #1
概要
失敗可能イニシャライザ(『init?』)は Optional を返します。初期化に失敗した場合は nil が返り、インスタンスは作られません。enum の『init(rawValue:)』もこの仕組みを使っています。
コンビニエンスイニシャライザはクラスのみで使えます。必ず同クラスの指定イニシャライザを呼ぶ必要があります。サブクラスが独自のイニシャライザを定義すると、親クラスのイニシャライザは自動継承されません。親のイニシャライザを使いたい場合は明示的に実装する必要があります。
クラスの基本についてはclass の基本 / init() / deinit()を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。