Могу ли я использовать индекс Swift, чтобы позаботиться о функциональности добавления для структуры, являющейся словарем? - PullRequest
0 голосов
/ 20 октября 2018

У меня есть структура с именем DailyEvents, которая инициализируется как словарь.Мы пытаемся добавить словарь в другой класс, однако получаем ошибку:

Невозможно использовать мутирующий член в неизменяемом значении, поскольку allEvents является свойством только для получения.

Вот функция, в которой мы пытаемся использовать структуру и добавление:

DispatchQueue.main.async {
   self.carePlanManager.store.enumerateEvents(of: ockActivity, startDate: self.startDate as DateComponents, endDate: self.endDate as DateComponents, handler: { (event, _) in
        if let event = event {
            self.dailyEvents?.allEvents.append(event)
        }
    }, completion: { (_, _) in
        innersemaphore.signal()
    })
}

Вот определение структуры:

struct DailyEvents {
    // MARK: Properties

    private var mappedEvents: [NSDateComponents: [OCKCarePlanEvent]]

    var allEvents: [OCKCarePlanEvent] {
        return Array(mappedEvents.values.flatMap{$0})
    }

    var allDays: [NSDateComponents] {
        return Array(mappedEvents.keys)
    }

    subscript(day: NSDateComponents) -> [OCKCarePlanEvent] {
        get {
            if let events = mappedEvents[day] {
                return events
            }
            else {
                return []
            }
        }

        set(newValue) {
            mappedEvents[day] = newValue
        }
    }

    // MARK: Initialization

    init() {
        mappedEvents = [:]
    }
}

Я думал, что подстрочный индекс заботится о функциональности для запроса или добавления к структуре данных, но это не так.Должен ли я создать функцию добавления непосредственно в структуре DailyEvents?

1 Ответ

0 голосов
/ 20 октября 2018

Ваша структура неверна.У вас есть это:

struct DailyEvents {
    private var mappedEvents: [NSDateComponents: [OCKCarePlanEvent]]
    // ...
}

Итак, у вас есть приватный словарь, который отображает OCKCarePlanEvent на компоненты даты (так что, я полагаю, вы можете быстро просматривать события по дням), ноу вас есть публичные методы, которые требуют от вызывающей стороны передавать и событие и компоненты данных.По сути, это означает, что вы ожидаете, что все иначе выполнят сопоставление для вас!

Это неправильно.Это ваше отображение (вы, структура).Вам нужен способ принять событие, чистое и простое, и отобразить его самостоятельно , как часть структуры, чтобы поместить его в нужное место в словаре, что бы это ни значило.Не каждая остальная работа по поддержанию словаря.Это ваша работа (вы, структура).

Когда вы начнете думать о своей структуре таким образом, правильно инкапсулируя, ее публичный API начнет становиться на свои места.

...