我可以使用Swift下标来照顾字典结构的附加功能吗?

时间:2018-10-20 08:10:26

标签: swift struct subscript

我有一个名为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 :(得分:0)

您的结构是错误的构想。你有这个:

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

因此,您有一个 private 字典,该字典将OCKCarePlanEvent映射到日期组件(我想,以便您可以按日快速查找事件),但是您有 public 方法,要求调用者同时向 传递数据组件。实际上,这意味着您希望每个人 else 都为您做映射!

错了。这是您的映射(您,结构)。您需要一种接受事件的方法,它简单且简单,并将其您自己映射为该结构的一部分,以便将其放入字典中的正确位置,无论这意味着什么。维护词典不是每个 else的工作。这是您的工作(您,结构)。

当您开始以这种方式考虑您的结构时,正确地封装它的公共API就会开始使用。