你已经有一个
Meal
这就引出了一个问题:为什么不直接定义你的饮食?
struct Meal {
// Don't prefix the properties with "meal".
// It leads to pointless code like "someMeal.mealName".
// You already know it's a meal by the type.
let name: String
let calories: Double
}
let meals = [
let meals = [
Meal(name: "Breakfast", calories: 725.03),
Meal(name: "Lunch", calories: 539.44),
Meal(name: "Dinner", calories: 849.49),
Meal(name: "Breakfast", calories: 956.53),
Meal(name: "Lunch", calories: 267.18),
Meal(name: "Dinner", calories: 567.17),
Meal(name: "Breakfast", calories: 353.47),
Meal(name: "Lunch", calories: 387.12),
Meal(name: "Dinner", calories: 700.76),
Meal(name: "Snack", calories: 62.87),
Meal(name: "Supper", calories: 857.35),
Meal(name: "Snack", calories: 176.56),
Meal(name: "Breakfast", calories: 123.79),
Meal(name: "Snack", calories: 16.74),
Meal(name: "Lunch", calories: 813.74),
Meal(name: "Dinner", calories: 858.23),
Meal(name: "Supper", calories: 127.26),
Meal(name: "Snack", calories: 448.19),
Meal(name: "Breakfast", calories: 932.62),
Meal(name: "Snack", calories: 60.22),
Meal(name: "Dinner", calories: 880.55),
Meal(name: "Snack", calories: 58.85),
Meal(name: "Snack", calories: 78.48),
Meal(name: "Snack", calories: 21.50),
Meal(name: "Breakfast", calories: 564.74),
Meal(name: "Snack", calories: 190.75),
Meal(name: "Lunch", calories: 911.01),
Meal(name: "Snack", calories: 67.47),
Meal(name: "Snack", calories: 81.44),
Meal(name: "Snack", calories: 25.35),
Meal(name: "Breakfast", calories: 954.94),
Meal(name: "Snack", calories: 45.75),
Meal(name: "Lunch", calories: 858.71),
Meal(name: "Snack", calories: 61.70),
Meal(name: "Snack", calories: 189.75),
Meal(name: "Snack", calories: 72.54),
Meal(name: "Snack", calories: 75.84),
]
如果并行阵列必须保留
(例如,它们来自您无法控制的API)
-
一个数组已经存储了它自己的计数,而在其他地方计数的硬编码引入了分裂的真值源。这里的风险是它们不同步:
-
如果添加了新的餐名/卡路里,但您忘记更新
37
-
如果删除了一些餐名/卡路里,那么您的
将过大并导致越界错误。
-
您将索引到一个空数组中,而不是追加
幸运的是,这些问题很容易解决!
-
将索引修复到末尾,并使用
append
相反:
var meals = [Meal]()
for i in 0..<37 {
meals.append(Meal(name: mealNames[i], calories: mealCalories[i])
}
-
assert(mealNames.count == mealCalories.count,
"Config error! The names and calories should match up one for one!")
var meals = [Meal]()
for i in 0..<meanNames.count {
meals.append(Meal(name: mealNames[i], calories: mealCalories[i])
}
-
assert(mealNames.count == mealCalories.count, ...)
var meals = [Meal]()
for i in mealNames.indices {
meals.append(Meal(name: mealNames[i], calories: mealCalories[i])
}
-
完全忘记索引!只需使用
zip(_:_:)
:
assert(mealNames.count == mealCalories.count, ...)
var meals = [Meal]()
for (name, calories) in zip(mealNames, mealCalories) {
meals.append(Meal(name: name, calories: calories))
}
-
迭代输入、转换输入并生成新数组只是一个映射操作。
assert(mealNames.count == mealCalories.count, ...)
let meals = zip(mealNames, mealCalories).map { name, calories in
Meal(name: name, calories: calories))
}
meals
不是通过重复突变构建的,我们现在可以使其成为
let
常数