Представьте себе этот массив отметок времени [Double]
:
hourlyTimes": [1551344400, 1551348000, 1551351600, 1551355200, 1551358800, 1551362400, 1551366000, 1551369600, 1551373200 ... ]
Это соответствует часам, за которые у меня есть данные для отображения.
Для простоты, вот полный массивкогда я отображаю только часы ( UTC ):
Hours = [9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 0, 3, 6, 9, 12, 15, 18, 21, 0, 3, 6, 9, 12, 15, 18, 0, 6, 12, 18, 0, 6, 12, 18, 0, 6, 12, 18, 0, 6, 12, 18, 0, 6, 12, 18, 0]
Теперь вот что я хочу достичь, мне нужно отфильтровать этот массив меток времени, чтобы сохранить только эти конкретныечасов в любой день (три часа).
[0, 3, 6, 9, 12, 15, 18, 21]
Хорошо, теперь давайте посмотрим на код :
let arrayOfTimestamp = time.hourlyTimes
let arrayOfHours = arrayOfTimestamp.map({ Date.init(timeIntervalSince1970: $0).hoursUTC})
let hoursToKeep = [0, 3, 6, 9, 12, 15, 18, 21]
let filtered = arrayOfHours.intersection(with: hoursToKeep)
Некоторые объяснения здесь:
time
в первой строке - ответ от бэкэнда, возвращающий мне все доступные метки времени.
struct MultiForecastTimeModel: Codable {
let hourlyTimes: [Double]
let dailyTimes: [Double]
}
.hoursUTC
- это просто расширение даты, чтобы извлечь компонент часа объекта Date.
var hoursUTC: Int {
var calendar = Calendar.current
let timezone = TimeZone(abbreviation: "UTC")!
calendar.timeZone = timezone
return calendar.component(.hour, from: self)
}
И, наконец, .intersection
тоже расширение, чтобы сделать то же самое.как классический intersection
, но также с сохранением индекса и вхождений.
extension Collection where Element: Equatable {
func intersection(with filter: [Element]) -> [Element] {
return self.filter { element in filter.contains(element) }
}
}
Все работает нормально, моя единственная проблема заключается в том, чтоТеперь я должен связать все эти значения как массив кортежей.
Примерно так:
let tuples = Array(zip(filtered, filtered.dropFirst()))
Но с фактической отметкой времени (соответствующей реальной дате), а не просто с массивомInt (часовой компонент).
Потому что, в конце концов, вот что мне нужно сделать:
self.hourlyMapDataSource.data.value = tuples
и мой источник данных ожидает кортеж отметки времени (Double, Double)
class HourlyMapDataSource : GenericDataSource<(Double, Double)>, UICollectionViewDataSource { }
Есть ли у вас какие-либо советы, как мне улучшить мой код и / или мою логику?
Заранее спасибо.
РЕДАКТИРОВАТЬ: МойМассив кортежей должен содержать только метки времени, время которых было «проверено» с помощью массива hoursToKeep
, так что разница между часами составляет 3 часа.
Я покажу вам часы, чтобы упростить их, но этофактическая соответствующая временная метка, которую я хочу:
[(9, 12), (12, 15), (15, 18) ...]