Много того, что вы пытаетесь сделать, может быть выполнена с использованием map
, sorted
, filtered
и reduce
функции Свифта.
struct CalorieLog {
var date: Date
var calories: Int
}
var logs: [CalorieLog] = []
// I changed your method to pass in calculatedCalories, we can make that random just for learning purposes. See below
func logCalories(calculatedCalories: Int) {
let currentDate: Date = Date()
logs.append(CalorieLog(date: currentDate, calories: calculatedCalories))
}
// This is a method that will calculate dummy calorie data n times, and append it to your logs array
func addDummyCalorieData(n: Int, maxRandomCalorie: Int) {
for _ in 1...n {
let random = Int(arc4random_uniform(UInt32(maxRandomCalorie)))
logCalories(calculatedCalories: random)
}
}
// Calculate 100 random CalorieLog's with a max calorie value of 1000 calories
addDummyCalorieData(n: 100, maxRandomCalorie: 1000)
// Print the unsorted CalorieLogs
print("Unsorted Calorie Data: \(logs)")
// Sort the logs from low to high based on the individual calories value.
let sortedLowToHigh = logs.sorted { $0.calories < $1.calories }
// Print to console window
print("Sorted Low to High: \(sortedLowToHigh)")
// Sort the CalorieLogs from high to low
let sortedHighToLow = logs.sorted { $1.calories < $0.calories }
// Print to console window
print("Sorted High to Low: \(sortedHighToLow)")
// Sum
// This will reduce the CaloreLog's based on their calorie values, represented as a sum
let sumOfCalories = logs.map { $0.calories }.reduce(0, +)
// Print the sum
print("Sum: \(sumOfCalories)")
Если вы хотите, чтобы сопоставить CalorieLogs как массив словарей вы могли бы сделать что-то вроде этого:
let arrayOfDictionaries = logs.map { [$0.date : $0.calories] }
Однако это своего рода неэффективна. Зачем вам нужен набор словарей? Если вы просто хотите отслеживать потребляемые/сжигаемые калории на определенную дату, вы можете просто сделать один словарь, где дата - ваш ключ, а массив Int
- это значение, которое представляет все калории за этот день. Вы, вероятно, потребуется только один словарь, т.е.
var dictionary = [Date : [Int]]()
Тогда вы могли бы найти все калории на дату, говоря dictionary[Date()]
. Хотя имейте в виду, что вам придется иметь точную дату и время. Вы можете изменить ключ своего словаря на что-то вроде String
, который просто представляет дату, такую как 2/19/2017
, что можно сравнить проще. Это необходимо учитывать при проектировании вашей модели.
Спасибо за ваш ответ. Как я получу сумму калорий каждого дня, а не общее количество калорий? А затем иметь массив с днем в качестве ключа и суммы этого дня в качестве значения? – He1nr1ch
@ He1nr1ch - См. Ответ Мэтта ниже. Я думаю, что это поможет вам достичь того, что вы просите – Pierce