ios - 重写枚举初始化?(rawValue : String) to not be optional

标签 ios swift enums initialization

如果 rawValue init 将返回 nil,我想在 Swift 中为我的枚举从 rawValue 初始化以返回默认值。 现在我有这样的东西:

public init(fromRawValue: String){
        self = Language(rawValue: fromRawValue) ?? .English
}

我不喜欢这个,因为它是全新的初始化程序。 我试着做这样的事情:

public init(rawValue: String){
        self = Language(rawValue: fromRawValue) ?? .English
}

但是我遇到了访问错误的运行时异常。我能否以某种方式让它工作,或者我只需要使用这个新的,我不能覆盖原来的不是可选的?

我想知道是否可以从 rawValue 覆盖原始初始化而不是使用使用可失败初始化的全新初始化。

最佳答案

默认初始化器是failable。这意味着如果接收到的参数与有效的枚举大小写不匹配,它会返回 nil

现在你想做两件不兼容的事:

  1. 您想重新定义默认初始化程序,使其不可失败。事实上,您希望在接收到的参数无效时创建一个默认枚举值。
  2. 在重新定义的初始化程序中,您想使用与新初始化程序相同的名称调用可失败初始化程序(不再存在)。

这是不可能的,我有以下3种可能的解决方案:

  1. 创建一个不同的 init

您使用默认值、不同的参数名称定义一个新的不可失败构造器,并在其中调用默认可失败构造器。

enum Language: String {
    
    case english = "English", italian = "Italian", french = "French"
    
    init(fromRawValue: String) {
        self = Language(rawValue: fromRawValue) ?? .english
    }
}
  1. 重新定义默认初始化

您重新定义了默认初始化程序,使其不可失败,并在其中编写了完整的逻辑。

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
        }
    }
}
  1. 创建静态函数
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

关于ios - 重写枚举初始化?(rawValue : String) to not be optional,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35119647/

相关文章:

java - 未找到字段导致的 LibGDX SerializationException

ios - 核心数据不保存我的数据

c++ - 使用 objective-c 框架的 Swift 项目

ios - 是否可以区分锁定设备和将应用程序发送到后台?

swift - 为什么 Self 和 self 有时在静态函数中指代不同的类型?

macos - Swift:deinit 方法中没有 println 的输出(不使用 playground)

Mysql 空 ENUM 到 postgresql ENUM

python - 为什么 Python 枚举中允许可变值?

iOS 字符串文件冲突 - 源语言中的相同字符串,目标语言中的不同

ios - 子类的类上的泛型