我想让Swift中枚举的init from rawValue返回默认值,如果rawValue init将返回nil.

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

我不喜欢这个,因为它是全新的初始值设定项.

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

但我遇到了运行时异常,访问权限不好.我能以某种方式让它工作吗,或者我只需要使用这个新的,我不能覆盖原来的一个,而不是可选的?

我想知道,是否有可能用使用failable one的全新解决方案覆盖rawValue not的原始init.

推荐答案

默认初始值设定项为failable.这意味着,如果接收到的参数与有效的枚举大小写不匹配,则返回nil.

现在要做两件不兼容的事情:

  1. 您希望设置默认的初始值设定项,使其不可失败.实际上,您希望在收到的参数无效时创建一个默认枚举值.
  2. 在重新定义的初始值设定项中,您希望使用与新初始值设定项相同的名称调用一个失败的初始值设定项(该初始值设定项已不存在).

这是不可能的,我建议以下三种可能的解决方案:

  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

Swift相关问答推荐

在swiftUI中测试取决于网络请求的Observer对象类的单元

如何在每天午夜重置布尔值

当计数大于索引时,索引超出范围崩溃

如何在SwiftUI 4+(iOS 16+)中使用新的NavigationStack进行导航

有条件地在同一视图上设置两个不同的过渡

在 Swift 中将异步任务包装到 DispatchWorkItem 中以使其可取消?

为什么我的 tableView 没有推送到 tableView 内的 detailViewController?

在 SwiftUI 中禁用 Select 器选项

子视图未在父视图 SwiftUI 中触发禁用状态更新

如何修改下面的代码,使图像 Select 的顺序与使用快速并发的图像呈现的顺序相匹配?

如何延迟 swift 属性 didSet 使其每秒只触发一次

为什么在Swift中每次调用Decimal类型的formatted()方法都会越来越慢?

状态变量更改后,SwiftUI 视图不会更改

Swift 中的Combine和didSet有什么区别?

来自数据的 SwiftUI 图像

SwiftUI 中的计时器崩溃屏幕

异步等待不会在项目中触发,但在 Xcode playground 中工作正常

找不到接受提供的参数的/的重载

协议扩展中的where self是什么

使用 ARAnchor 插入 node 和直接插入 node 有什么区别?