【问题标题】:A way of declaring the type of a Swift dictionary with many types in it, including embedded dictionaries一种声明 Swift 字典类型的方法,其中包含多种类型,包括嵌入式字典
【发布时间】:2020-08-04 09:37:12
【问题描述】:

我有一个正在初始化的struct,带有一个字典。该字典中的值有许多不同的类型:StringIntDictionary。同样,这个嵌入式字典也有许多不同的类型(StringIntBoolArrayDictionary)。我知道,这是一团糟。所以,我正在尝试为这个 struct 的初始化程序找到正确的语法,它将这个大字典作为输入。

我试过这个,但它不能满足我的大部分元素。

init(dictionary: [AnyHashable: [AnyHashable: [AnyHashable: Any]]){
...
}

例如,当尝试在字典的第一层访问 String 时,编译器期望的是 [AnyHashable: [AnyHashable: Any]] 类型的对象。

有没有一种通用的方法在这个初始化器中声明这个字典的类型?我希望能够访问值并使用它们初始化变量或将这些值用作字典。有没有办法在 Swift 中做到这一点?

补充信息:我正在从我的 FireStore 数据库中提取信息,这就是为什么我有这个分层的字典。 FireStore 文档可以处理许多不同级别的信息,出于设计目的,我不得不填写我的信息。

谢谢!

【问题讨论】:

    标签: swift dictionary types initialization


    【解决方案1】:

    例如,当尝试在字典的第一层访问 String 时,编译器期望的是 [String: [String: Any]] 类型的对象。

    确实,因为通过编写dictionary: [String: [String: [String: Any]],您向编译器保证dictionary 的值是[String: [String: Any]]

    如果您希望您的字典能够在运行时保存许多不同的类型,您需要给它一个静态类型,它是您想要使用的所有类型的超类型(协议或超类)。有两种方法可以使用这些值:

    1. 您使协议或超类包含函数(以及属性、下标等)。你想使用的。您可以在值上调用这些函数,而无需知道值的具体类型。编译器知道 dict 中的所有值都将支持这些函数(由于是类的子类,或者符合协议)。
    2. 在运行时将值(例如,您知道键 "age" 的值将始终为 Int)向下转换为执行所需操作的更具体的类型。

    最通用、普遍适用的类型是Any。但它的通用性来自于它没有任何要求,所以你真的不能用 Any 做任何事情,除了传递它,最终不得不对它做任何事情。

    TL;DR:您必须使用Any,或者可能是其他一些通用协议类型或超类

    更好的是,有很多库可以将 Codable 功能添加到 Firebase。我建议你使用其中之一。

    【讨论】:

    • 谢谢你的回答亚历山大。您确实为我澄清了问题并帮助我找到了潜在的解决方案。所以我在最后一天一直在尝试实施你的建议。而且我遇到了问题:所以我不能使用Any 作为字典值,因为然后我将这些值用作其他字典键(并且这些必须是可散列的)。因此,我在课堂上实现了 Codable 功能,但无法将 firebase [String: Any] 转换为 [String: myCodableStruct] ....
    • “任何作为字典值,因为我将这些值用作其他字典键(并且这些必须是可散列的)”这就是 AnyHashable 的用途。同样,我认为您在错误的级别上解决了这个问题。 Swift 中的可编码系统通过手动解包字典之类的方式解决了您遇到的 99% 的困难
    • 所以我查看了诸如 ObjectMapperCodableFirebase 之类的库,但两者都遇到了同样的问题。这是this。并把那只兔子整得无法解决
    • @AntoineNeidecker 我想我以前遇到过这个错误,但是我是如何解决它的 IDR。我认为这是更值得关注的问题,它将使您的代码库处于更好的空间
    • 你在解决它的时候没有遇到this issue
    猜你喜欢
    • 2011-09-24
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 2021-07-13
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多