我有一个名为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结构中创建一个追加函数吗?
答案 0 :(得分:0)
您的结构是错误的构想。你有这个:
struct DailyEvents {
private var mappedEvents: [NSDateComponents: [OCKCarePlanEvent]]
// ...
}
因此,您有一个 private 字典,该字典将OCKCarePlanEvent映射到日期组件(我想,以便您可以按日快速查找事件),但是您有 public 方法,要求调用者同时向 和传递数据组件。实际上,这意味着您希望每个人 else 都为您做映射!
错了。这是您的映射(您,结构)。您需要一种接受事件的方法,它简单且简单,并将其您自己映射为该结构的一部分,以便将其放入字典中的正确位置,无论这意味着什么。维护词典不是每个 else的工作。这是您的工作(您,结构)。
当您开始以这种方式考虑您的结构时,正确地封装它的公共API就会开始使用。