【问题标题】:How to switch between two enumerations in Swift?如何在 Swift 中的两个枚举之间切换?
【发布时间】:2019-05-11 10:24:49
【问题描述】:

我有 3 个枚举:计算类型 (+,-),+ 类别(10 个案例),- 类别(15 个案例)。

那么如何使用我的枚举,以便根据计算类型,模型的实例将接受所需的列表。

//Example of Model
class Transaction {

    var typeOfCalculation: TypeOfCalculation 
    var category: CategoryForConsuption
}

enum TypeOfCalculation {
    case income
    case consuption
}

enum CategoryForConsuption{
    case noCategories
    case food
    case cafesAndRestaurants
    case manufacturedGoods
}

enum CategoryForIncome {
    case salary
    case debt repayment
} 

逻辑如下:如果计算类型是消费,则改为CategoryForConsuption,如果是收入,则改为CategoryForIncome。

我编辑了模型:

enum Accounting {
    case income(category: IncomeCategory)
    case consumption(category: ConsumptionCategory)
}

enum ConsumptionCategory: String, CaseIterable {
    case noCategories = "No categories"
    case food = "Food"
    case cafesAndRestaurants = "Cafes and Restaurants"
    case manufacturedGoods = "Manufactured Goods"
    case forceMajeure = "Force Majeure"
}

enum IncomeCategory: String, CaseIterable {
    case salary = "Salary"
    case deposit = "Deposit"
}

但现在我遇到了新问题。因为我需要将所有这些用于我的数据模型(realM)。 我应该怎么做?

这是我的旧数据模型:

  @objc dynamic private var privateTypeOfCalculation: String = TypeOfCalculation.consumption.rawValue
var typeOfCalculation: TypeOfCalculation {
get { return TypeOfCalculation(rawValue: privateTypeOfCalculation)! }
set { privateTypeOfCalculation = newValue.rawValue }
}

 @objc dynamic private var privateCategoryForConsuption: String = CategoryForConsuption.noCategories.rawValue
var categoryForConsuption: CategoryForConsuption {
get { return CategoryForConsuption(rawValue: privateCategoryForConsuption)! }
 set { privateCategoryForConsuption = newValue.rawValue }
 }

【问题讨论】:

  • 案件还债——真的合算吗?
  • 不,因为是例子
  • 我正在尝试使用您的建议

标签: ios swift enums


【解决方案1】:

你可以让TypeOfCalculation拥有associated values

enum TypeOfCalculation {
    case consuption(category: CategoryForConsuption)
    case income(category: CategoryForIncome)
}

然后你只需要在你的模型中有typeOfCalculation

class Transaction {

    var typeOfCalculation: TypeOfCalculation
}

我还建议您重命名您的案例和枚举名称:

enum Calculation {
    case consumption(category: ConsumptionCategory)
    case income(category: IncomeCategory)
}

class Transaction {

    var calculation: Calculation
}

然后您可以像这样打开calculation

switch transaction {
   case consumption(let category):
       ...
   case income(let category):
       ...
}

【讨论】:

  • 好的,我想我明白你的意思了。但是这一切如何与领域一起使用?我想添加我的模型。
  • @MikhailTseitlin 我不知道你在使用 Realm。在这种情况下,您需要将 typecategory 存储为字符串,就像您在此处所做的那样。您可以将 calculation 属性设为计算属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-15
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多