Swiftの列挙型のrawValueからinitを取得して、rawValue initがnilを返す場合にデフォルト値を返します。現在、次のようなものがあります。
public init(fromRawValue: String){
self = Language(rawValue: fromRawValue) ?? .English
}
これは完全に新しい初期化子であるため、これは好きではありません。私はこのようなものを作ろうとしました:
public init(rawValue: String){
self = Language(rawValue: fromRawValue) ?? .English
}
しかし、アクセスが悪いランタイム例外があります。どういうわけかそれを機能させることができますか、またはこの新しいものを使用する必要があり、元のオプションをオーバーライドしてオプションではありませんか?
失敗可能なものを使用している完全に新しいもので回避策ではないrawValueからの元のinitをオーバーライドできるかどうかを知りたいです。
デフォルトの初期化子はfailable
です。これは、受け取ったパラメーターが有効な列挙型のケースと一致しない場合、nil
を返すことを意味します。
今、あなたは2つの互換性のないことをしたい:
これは不可能です。次の3つの解決策があります。
デフォルト値、異なるパラメータ名を使用して、フェイル不可の新しいイニシャライザを定義し、その内部でデフォルトのフェイル可能イニシャライザを呼び出します。
enum Language: String {
case english = "English", italian = "Italian", french = "French"
init(fromRawValue: String){
self = Language(rawValue: fromRawValue) ?? .english
}
}
デフォルトのイニシャライザを再定義し、失敗しないようにし、その中に完全なロジックを記述します。
enum Language: String {
case english = "English", italian = "Italian", french = "French"
init(rawValue: String) {
switch rawValue {
case "Italian": self = .italian
case "French": self = .french
default: self = .english
}
}
}
enum Language: String {
case english = "English", italian = "Italian", french = "French"
static func build(rawValue: String) -> Language {
return Language(rawValue: rawValue) ?? .english
}
}
これで、Language
値を作成できます。
let italian = Language.build(rawValue: "Italian") // Italian
let defaultValue = Language.build(rawValue: "Wrong input") // English
デフォルトのinitを再定義するためのLucaのソリューションに加えて、rawValue
パラメータータイプをオプションにすることもできます。これにより、データソースが信頼できない場合に呼び出しサイトの一部のコードが削減されます。
enum PrecipitationType: String {
case rain, snow, sleet, none
typealias RawValue = String
init(rawValue: String?) {
guard let rawValue = rawValue else { self = .none; return }
switch rawValue {
case PrecipitationType.rain.rawValue: self = .rain
case PrecipitationType.snow.rawValue: self = .snow
case PrecipitationType.sleet.rawValue: self = .sleet
default: self = .none
}
}
}
最初にこれを試したとき、複数のエラーが生成されました。キーは、RawValue
typealiasを再定義して、RawRepresentable
への準拠を維持することでした。