ProgrammingiOS開発者

Swiftにおける失敗可能なイニシャライザ(`init?`)はどのように機能しますか?それをいつ、なぜ使用するのか、考慮すべき重要なニュアンスは何ですか?

Hintsage AIアシスタントで面接を突破

回答

Swiftの失敗可能なイニシャライザ(init?)は、型のインスタンスを作成する際に失敗する可能性があることを示すために使用され、失敗した場合はnilを返します。これらは、入力データの検証や成功しない可能性のある変換のためによく使用されます。失敗可能なイニシャライザでは、オブジェクトの作成が失敗したことを示すために明示的にnilを返すことができます。

例:

struct User { let name: String let age: Int init?(name: String, age: Int) { guard !name.isEmpty, age > 0 else { return nil } self.name = name self.age = age } }

これにより、不正なオブジェクトの作成を防ぐことができます。

重要なニュアンス:

  • 継承チェーンにおいて、失敗可能なイニシャライザは、失敗可能なイニシャライザでのみオーバーライドできます。
  • 失敗可能なイニシャライザを持つ構造体を配列に使用する場合、イニシャライザのマッピング(compactMap)が便利で、不正なインスタンスをフィルタリングできます。

陷し問

質問: init?init!は何が異なり、いつ暗黙のアンラップを伴う失敗可能なイニシャライザを使用しますか?

回答: init?はオプショナル(<type?>)を返し、イニシャライゼーションが失敗した場合はnilを返すため、安全な処理が必要です。init!は暗黙のアンラップオプショナル(<type!>)を返し、イニシャライゼーションが失敗した場合もnilを返しますが、そのオブジェクトをチェックせずに使用するとランタイムクラッシュが発生します。init!は、あなたの文脈でイニシャライゼーションが失敗することがないと確信できる場合にのみ使用してください(例:UIKitでのストーリーボードを使用する場合)。

let value = Int("abc") // valueはnilになります

テーマの詳細を知らないことによる実際のエラーの例。


物語

JSONを手動でパースする際に、失敗可能なイニシャライザの代わりに通常のイニシャライザを使用しました。これにより、検証が機能せず、「空」のユーザーが作成され、アプリケーションが無効なデータをフィルターしませんでした。


物語

潜在的に無効なデータでのinit!の使用は、APIが更新された後にアプリケーションのクラッシュを引き起こしました。入力データの形式が変更され、オブジェクトの抽出時にランタイム例外が発生しました。


物語

失敗可能なinitのカスタム実装で、いくつかのシナリオで明示的にnilを返すのを忘れ、その結果、構造が「汚れた」フィールドで初期化され、後にビジネスロジックにバグを引き起こしました。