【问题标题】:How do you create main-category/subcategory data model in swift?如何快速创建主类/子类数据模型?
【发布时间】:2020-11-18 10:16:30
【问题描述】:

我正在创建一个预算应用程序,但我是编程新手。

我想创建一个类似于 Apple Reminders 应用程序的界面。

第一个视图是主要类别的列表。

当您点击一个主要类别时,将出现子类别列表。

我不确定是使用类还是结构。

这是代码在我脑海中的样子:

struct Category {
    
    let mainCategories: [String] = [
    
        "Income",
        "Housing",
        "Transportation",
        "Food",
        ...
    ]
    
    let incomeSubCategory: [String] = [
        
        "Salary",
        "Bonus",
        "Rental Income",
        ...

        
    ]
    
    let housingSubCategory: [String] = [
    
        "Mortgage/Rent",
        "Property Tax",
        "Homeowner's Insurance",
        ...
    
    ]
}

我这样做是否正确?还是应该使用类进行继承?

谢谢。

编辑:

我尝试过使用枚举,但数据似乎不如结构灵活和可访问。

是否可以使 SubCategory 成为 Category 中的结构数组?

像这样:

struct Category {
    
    var name: String
    var color: UIColor
    var amount: Double
    var subCategories: [SubCategory]
    
}

struct SubCategory {
    var name: String
    var amount: Double
}



let categories = [

    Category(
        name: "Income",
        color: UIColor(rgb: Constants.green), subCategories: [name: "Paycheck", amount: 2500.00])
    ]

【问题讨论】:

  • 我认为你应该有枚举而不是数组

标签: arrays swift class struct


【解决方案1】:

结构可能没问题。您所描述的任何内容都不需要继承,而且您似乎没有修改信息。

我的建议是将相关信息放在一起。考虑到这一点,我会这样做:

struct Category {
    var name: String
    var subCategories: [String]
}

let categories = [Category(name: "Income", subCategories: ["Salary", "Bonus", "Rental Income"]),
                  Category(name: "Housing", subCategories: ["Mortgage/Rent", "Property Tax", "Homeowner's Insurance"])]

这里的好处是,当您选择一个类别时,它的相关子类别是隐式可用的...无需额外的工作来确定哪些匹配。

【讨论】:

  • 我已经开始实现这个结构,但我无法访问 subCategory 数据。我想知道我是否可以做一些事情,比如在结构中添加一个结构数组。我已经更新了问题。
  • 应该可以。使用subCategories: [SubCategory(name: "Paycheck", amount: 2500.00)] 然后print(categories[0].subCategories[0].name) 初始化子类别。
【解决方案2】:

使用Enums 代替struct/class

enum MainCategory: String, CaseIterable {
    case income, housing //...
}
enum IncomeSubCategory: String, CaseIterable {
    case salary, bonus //...
}
enum HousingSubCategory: String, CaseIterable {
    case rent, tax //...
}

CaseIterable 协议一致性允许您拥有allCases 数组,以防您需要它来逐个迭代值。像这样:

MainCategory.allCases.forEach { print($0) }

【讨论】:

    猜你喜欢
    • 2020-11-24
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多