使用键和值约束扩展字典

Posted

技术标签:

【中文标题】使用键和值约束扩展字典【英文标题】:Extending Dictionary with key and value constraints 【发布时间】:2015-09-28 04:32:45 【问题描述】:

我想扩展字典并将其限制为 NSDate 的特定键类型,其值类型为 Array<MyClass>

MyClass 是一个没有子类的 swift 类。

extension Dictionary where Key: NSDate, Value: Array<MyClass>
    func myFunction() -> Int
        // Some thing useful
    

以上代码返回构建错误:

类型“值”限制为非协议类型 '数组'

好吧,看来它需要被限制到一个特定的协议,但奇怪的是,当我将 Value 限制为:

扩展字典,其中键:NSDate,值: 我的班级

编译器没有报错,构建成功。但是 MyClass 不是协议。那么是什么给了?

我已经设法像这样限制它:

extension Dictionary where Key: NSDate, Value: CollectionType, Value.Generator.Element: MyClass
    func myFunction() -> Int
        var count = 0
        for (_, graphicItemArray) in self
            count+= (graphicItemArray as! [MyClass]).count
        

        return count
    

但这需要强制转换,因为我需要以整数形式获取 count 属性。

那么为什么我不能明确地将其限制为 [MyClass] 的值类型?

【问题讨论】:

对您的问题的建议:标题可以是更具体的问题,例如Extending dictionary with type constraint using a Struct。此外,如果您从示例中删除 OP1ScheduleControlGraphicItem 并将其替换为 NSStringUIView(已经存在的内容)之类的内容,则可以更轻松地复制和粘贴示例并尝试它们。 是的,谢谢您指出。我将把 MyClass 改为。我认为重要的是要注意它是一个没有子类的快速类。 【参考方案1】:

无法将where 子句与结构一起使用可能是一个错误。检查language reference for where clauses 并关注

conformance-requirement → type-identifier­ | ...

似乎type-identifier 应该接受struct,即使他们使用的示例是Int

这可能是提交错误的东西。


与您的具体问题有关,如果您使用_ArrayType 似乎可以工作,这是Array 实现并具有您需要的方法的协议。

extension Dictionary where Key: NSDate, Value: _ArrayType ...

我不确定使用这种内部协议是否会标记您的应用并使其无法通过 Apple 审核。

【讨论】:

使用 _ArrayType 允许我在数组上使用“count”属性。但是正如您所说,问题仍然存在,这是否合法。此外,我没有找到将其限制为“MyClass”的特定项目数组的方法。如果没有发布更多解决方案,我想我会听取您的建议并提交错误。谢谢! 我当然希望这是一个错误。否则不可能将字典扩展名限制为Value: String,这似乎很愚蠢。

以上是关于使用键和值约束扩展字典的主要内容,如果未能解决你的问题,请参考以下文章

枚举字典迭代键和值[重复]

将字典的键和值并行传递给函数?

使用 for loop .splitlines 循环将键和值添加到字典

使用 min 从字典中获取最低键和值 [重复]

字典键和值以分隔 numpy 数组

两个字典(键和值)的递归差异?