【问题标题】:Swift Struct Property with Generic Enum具有通用枚举的 Swift 结构属性
【发布时间】:2020-03-08 23:08:39
【问题描述】:

我目前正在创建设置页面。我正在尝试将 Enum 动态分配到我的 struct 属性中。 我想要实现的是,每当调用 Settings 结构时,它都会自动将所有相应的设置附加在一起。下面是枚举

protocol BaseSettings {}

enum SettingsCategory: String, CaseIterable {
    case sales = "Sales"
    case payment = "Payment"
}

struct SettingsSection {
    var settingsNameArray: [BaseSettings]
    var settingsCategoryName: SettingsCategory

    init(settingsCategory: SettingsCategory) {
        self.settingsCategoryName = settingsCategory

        switch settingsCategory {
        case .sales:
            self.settingsNameArray = SalesSettings.allCases
        case .payment:
            self.settingsNameArray = PaymentSettings.allCases
        }
    }
}

struct Settings {
    var sections = [SettingsSection]()

    init() {
        for eachSettingCategory in SettingsCategory.allCases {
            self.sections.append(SettingsSection(settingsCategory: eachSettingCategory))
        }
    }
}

enum SalesSettings: String, BaseSettings, CaseIterable {
    case testSettings = "Test Sales Settings"
}

enum PaymentSettings: String, BaseSettings, CaseIterable {
    case testSettings = "Test Payment Settings"
}

以上代码运行良好。设置按部分分组。但是,当我想填充每个枚举案例的 String 原始值时,我遇到了一个问题。由于 Protocol BaseSettings 不是枚举,我无法获取 rawValue

 let settingsDataSource = SettingsConstant.Settings()
 let settingsName = settingsDataSource.sections[indexPath.section].settingsNameArray[indexPath.row]
    cell.textLabel?.text = "\(settingsName)"

tableView 不是显示每个枚举案例的 rawValue,而是显示每个枚举案例。

如何修复此数据结构?谁能指导我?

谢谢

【问题讨论】:

    标签: swift enums


    【解决方案1】:

    在协议声明中指定您需要一个原始值!

    protocol BaseSettings {
        var rawValue: String { get }
    }
    

    SalesSettings 等枚举将自动符合这一新要求,因为当RawValueString 时,它与RawRepresentable.rawValue 完全相同。

    【讨论】:

    • 哇,先生!是的,它有效!如果假设枚举 SalesSettings 有一个 getter 属性,我该如何访问它?希望你能帮我这个:)
    • @alvinWB 您首先需要确保BaseSettings 的实例实际上是SalesSettings 的实例:if let ss = settingsName as? SalesSettings { /* access "ss.yourProperty" here*// } 但如果没有更多信息,我的建议可能不是最好的。我建议您发布一个新问题,提供更多信息。
    • 感谢先生的帮助!以前 XCode 不允许我将其转换为 SalesSettings。似乎是因为我将 SalesSettings 放在了一个枚举中。当我从 Wrapper 枚举中删除 SalesSettings 枚举时,我已经可以转换它了:)。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 2015-09-23
    • 2018-05-14
    相关资源
    最近更新 更多