значение dict в структуре игнорируется для Bool - PullRequest
0 голосов
/ 17 января 2019

теперь со счастливым, коротким Примером минимальной жизнеспособности внизу

Я вижу это странное поведение .. Я пытаюсь установить запись временного ряда с местоположением в 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 } }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...