如何在处理变量和 if 语句时减少 Swift 中的代码?

How to reduce code in Swift when dealing with variables and if statements?

我目前正在构建一个应用程序来自学 Swift 所以我还是很陌生。我遇到了一个问题。该应用程序是一个时间表创建者。我有多达十二个科目都有分数。然后将这些点分布在几天内。我有一个代码概念,可以使用循环很好地分配点,但想知道是否有什么可以减少代码量,而不是我目前拥有的,每个主题都是这样的:

subject1.monpts = 20
subject1.tuepts = 20
subject1.wedpts = 20
subject1.thurpts = 20
subject1.fripts = 20
subject1.satpts = 20
subject1.sunpts = 20

这 x12 代码很多。但我需要它,以便每个主题都可以选择一周中每一天的分数(然后应用程序将根据这些分数分配时间)。为了打印时间表,我将每个 subjectX.daypts 放在一起,但这意味着我每天要写出 12 个科目。

我还需要仅在变量实际具有值时才显示内容。我计划使用 if 语句来执行此操作,但这意味着为目前为 12 x 7 = 48 的每个变量编写一个语句!例如。 (忽略格式 - 仅用于概念)

    if subjects1.monpts = 0 {
        subjects1monLabel = isHidden.false
        // or just a print / don't print statement
    }

我觉得好像缺少一种更简单的方法!

这张图片更好地解释了这个概念:

你对如何组织这个 material 的整个看法是颠倒的。首先考虑所有受试者的共同点:7 天中每一天的分数、7 天中每一天的隐藏标签,等等。现在将其合并到一个类型(一个结构)中:Subject。现在,您有一个主题数组,而不是 subjects1...subjects2... 等等。

所以:任何时候你有一个用数字命名的变量,它应该是一个数组。任何时候你有一堆重复的概念,那应该是一个类型。

甚至一周七日的概念本身也可以用同样的方式浓缩。如果我们谈论的只是每天的点数,那么七个数字的数组就可以了。

所以我们最终会得到这样的骨架:

struct Subject {
    var dayPoints : [Int]
}
var myTwelveSubjects : [Subject]

...随着更多要求的上线,您可以构建它,例如是否隐藏一天。

如果您想保存有关这些字段的信息,您可以拥有一个包含枚举键和整数值的字典,如下所示:

enum WeekDay: CaseIterable {
    case monday, tuesday, wednesday, thursday, friday, saturday, sunday
}

struct Subject {
    var pointsForWeekDay: [WeekDay: Int]
}

现在你可以做:

var pointsForWeekDay = Dictionary(uniqueKeysWithValues:
    WeekDay.allCases.map { weekDay in
        return (weekDay, 20)
    }
)
var subject = Subject(pointsForWeekDay: pointsForWeekDay)

CaseIterable 允许您访问枚举的所有值。

Map 获取每个 weekDay 并使用您的 Int 值创建一个元组数组。

最后,您可以将其组合成一个完整的 DictionaryuniqueKeysWithValues 初始值设定项,它采用生成的元组数组。