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を返すのを忘れ、その結果、構造が「汚れた」フィールドで初期化され、後にビジネスロジックにバグを引き起こしました。