теперь со счастливым, коротким Примером минимальной жизнеспособности внизу
Я вижу это странное поведение .. Я пытаюсь установить запись временного ряда с местоположением в true:
struct TimeSeriesEntry: Codable, Equatable {
let id: String
let uid: String
let date: Date
let apps: [String:Double]
let locations: [String:Bool]
func changeApp(app: String, value: Double) -> TimeSeriesEntry {
var apps = self.apps
apps[app] = value
return TimeSeriesEntry(id: self.id, uid: self.uid, date: self.date, apps: apps, locations: self.locations)
}
}
Нет расширений для этого кода. Это TimeSeriesEntry
во всей полноте.
Я оцениваю это в отладчике, потому что по какой-то причине он всегда установлен false , но я выполняю присваивание в коде true в моем коде. Он работает так же в отладчике:
Оценка отладчика
TimeSeriesEntry(id: String(describing: UUID()), uid: DBIFirebase.uid,
date: data.date.round(to: TimeSeries.defaults.interval,
TimeSeries.defaults.intervalComponent), apps:[:], locations:
[data.id:true])
.locations["c72b2cc2-897e-4621-8fba-452cf43afa0a"]
* * Результат тысячу двадцать-один * * одна тысяча двадцать-два
... = (Bool?) false
В других местах, когда я назначаю apps
, удвоение работает просто отлично. Я немного застрял в том, почему это происходит.
1028 * дополнения *
фактическое назначение происходит в этой функции, и в этой ветви кода это раздел функции для местоположений, а не приложений:
func timeSeriesData (appData: AppData? = nil, locationData: LocationData? = nil) -> TimeSeriesEntry? {
if let data = appData {
return TimeSeriesEntry(id: String(describing: UUID()), uid: DBIFirebase.uid, date: data.date.round(to: TimeSeries.defaults.interval, TimeSeries.defaults.intervalComponent), apps: [data.id:data.metric], locations:[:])
} else {
guard let data = locationData else {
return nil
}
return TimeSeriesEntry(id: String(describing: UUID()), uid: DBIFirebase.uid, date: data.date.round(to: TimeSeries.defaults.interval, TimeSeries.defaults.intervalComponent), apps:[:], locations: [data.id:true])
}
}
, чтобы сделать его полностью автономным mve:
import Foundation
struct TimeSeriesEntry: Codable, Equatable {
let id: String
let uid: String
let date: Date
let apps: [String:Double]
let locations: [String:Bool]
func changeApp(app: String, value: Double) -> TimeSeriesEntry {
var apps = self.apps
apps[app] = value
return TimeSeriesEntry(id: self.id, uid: self.uid, date: self.date, apps: apps, locations: self.locations)
}
}
struct LocationData: Codable, Equatable {
// let name: String
let id: String
let date: Date
let latitude: Double
let longitude: Double
}
func timeSeriesData (locationData: LocationData) -> TimeSeriesEntry? {
return TimeSeriesEntry(id: String(describing: UUID()), uid: "DBIFirebase.uid", date: locationData.date, apps:[:], locations: [locationData.id:true])
}
let df = DateFormatter()
df.dateFormat = "yyyy-MM-dd HH:mm:ssZ"
let locationData = LocationData(
id: "c72b2cc2-897e-4621-8fba-452cf43afa0a",
date: df.date(from: "2017-08-28 00:00:01Z")!,
latitude: 67.1404,
longitude: -151.4804)
let timeSeriesEntry = timeSeriesData(locationData: locationData)
в repl, местоположения будут содержать 1 запись с правильным идентификатором, но с булевым набором false :
39. let timeSeriesEntry = timeSeriesData(locationData: locationData)
df: DateFormatter = {
Foundation.Formatter = {
baseNSObject@0 = {
isa = NSDateFormatter
}
}
}
locationData: LocationData = {
id = "c72b2cc2-897e-4621-8fba-452cf43afa0a"
date = 2017-08-28 00:00:01 UTC
latitude = 67.1404
longitude = -151.4804
}
timeSeriesEntry: TimeSeriesEntry? = some {
id = "C836C671-B266-4CA1-9A80-841E3329C6C8"
uid = "DBIFirebase.uid"
date = 2017-08-28 00:00:01 UTC
apps = 0 key/value pairs
locations = 1 key/value pair {
[0] = {
key = "c72b2cc2-897e-4621-8fba-452cf43afa0a"
value = false
}
}
}
edit: ладно, теперь я в замешательстве .. играю с этим немного больше в реплее, я вижу:
42> timeSeriesEntry!.locations["c72b2cc2-897e-4621-8fba-452cf43afa0a"]
$R1: Bool? = true
43> timeSeriesEntry!
$R2: TimeSeriesEntry = {
id = "C836C671-B266-4CA1-9A80-841E3329C6C8"
uid = "DBIFirebase.uid"
date = 2017-08-28 00:00:01 UTC
apps = 0 key/value pairs
locations = 1 key/value pair {
[0] = {
key = "c72b2cc2-897e-4621-8fba-452cf43afa0a"
value = false
}
}
}
44> timeSeriesEntry!.locations
$R3: [String : Bool] = 1 key/value pair {
[0] = {
key = "c72b2cc2-897e-4621-8fba-452cf43afa0a"
value = false
}
}