Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
失敗可能イニシャライザ / required init
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(...) | クラスのみ使えるコンビニエンスイニシャライザです。 |
サンプルコード
// 失敗可能イニシャライザを持つ 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 Vehicle {
var name: String
var speed: Int
// 指定イニシャライザ
init(name: String, speed: Int) {
self.name = name
self.speed = speed
}
// コンビニエンスイニシャライザ(指定イニシャライザを呼ぶ)
convenience init(name: String) {
self.init(name: name, speed: 60)
}
// サブクラスで必須実装
required init(json: [String: Any]) {
self.name = json["name"] as? String ?? "Unknown"
self.speed = json["speed"] as? Int ?? 0
}
}
class Car: Vehicle {
required init(json: [String: Any]) {
super.init(json: json)
}
}
let bike = Vehicle(name: "自転車")
print("\(bike.name): \(bike.speed)km/h")
let car = Car(json: ["name": "スポーツカー", "speed": 200])
print("\(car.name): \(car.speed)km/h")
概要
失敗可能イニシャライザ(『init?』)は Optional を返します。初期化に失敗した場合は nil が返り、インスタンスは作られません。enum の『init(rawValue:)』もこの仕組みを使っています。
コンビニエンスイニシャライザはクラスのみで使えます。必ず同クラスの指定イニシャライザを呼ぶ必要があります。サブクラスが独自のイニシャライザを定義すると、親クラスのイニシャライザは自動継承されません。親のイニシャライザを使いたい場合は明示的に実装する必要があります。
クラスの基本についてはclass の基本 / init() / deinit()を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。