如何在处理变量和 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 值创建一个元组数组。
最后,您可以将其组合成一个完整的 Dictionary
和 uniqueKeysWithValues
初始值设定项,它采用生成的元组数组。
我目前正在构建一个应用程序来自学 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 值创建一个元组数组。
最后,您可以将其组合成一个完整的 Dictionary
和 uniqueKeysWithValues
初始值设定项,它采用生成的元组数组。