代码之家  ›  专栏  ›  技术社区  ›  Laurence Wingo

我可以使用swift下标来处理作为字典的结构的附加功能吗?

  •  -1
  • Laurence Wingo  · 技术社区  · 6 年前

    我有一个结构叫做 DailyEvents 它初始化为字典。但是,我们试图在另一个类中附加到字典,收到错误:

    不能使用不可变值上的突变成员,因为Advvices是GET唯一属性。

    下面是我们尝试使用struct和append的函数:

    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 回复  |  直到 6 年前
        1
  •  0
  •   matt    6 年前

    你的结构被误解了。你有这个:

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

    所以你有一个 私有的 将ockCarePlanEvent映射到日期组件的字典(我想,这样您可以每天快速查找事件),但是 公众的 要求调用方传递的方法 二者都 一件事 数据组件。实际上,这意味着你希望每个人 其他的 为你做地图!

    那是错误的。这是 你的 映射(你,结构)。你需要一种接受事件的方式,简单明了,并映射它 你自己 ,作为结构的一部分,以便将其放在字典中的正确位置,不管这意味着什么。不是每一个 其他的 维护字典的工作。它是 你的 作业(你,结构)。

    当您开始以这种方式考虑您的结构并正确封装时,它的公共api将开始就位。