用Swift中的嵌套字典类型确定字典

用Swift中的嵌套字典类型确定字典,swift,swiftui,Swift,Swiftui,我有一个结构如下的字典,我需要声明它的类型,以避免在索引嵌套字典时出现诸如“Binary operator”!=“不能应用于类型为“Any?”和“String”的操作数之类的错误 @State var data = [ "base" : "baseLanguage", "target" : "targetLanguage", "languages" : [

我有一个结构如下的字典,我需要声明它的类型,以避免在索引嵌套字典时出现诸如“Binary operator”!=“不能应用于类型为“Any?”和“String”的操作数之类的错误

@State var data = [
    "base" : "baseLanguage",
    "target" : "targetLanguage",
    "languages" : [
        "language" : [
            "target" : true,
            "strings" : [
                "..." : [
                    "translation" : "...",
                    "pinned" : false,
                    "order" : 0
                ]
            ]
        ]
    ]
]
Xcode将该类型标识为“[String:Any]”,但我希望它是以下类型。在声明@State var data:type时,我不确定该类型的正确语法是什么

[
    String : String,
    String : String,
    String : [
        String : [
            String : Bool,
            String : [
                String : [
                    String : String,
                    String : Bool,
                    String : Int
                ]
            ]
        ]
    ]
]

基于鼓励使用Structs的评论,我建议将此作为我自己问题的答案。此数据变量的内容与原始post相同,但已重新格式化为使用结构

struct data: Hashable {
    let base: String
    let target: String
    let languages: Array<language>
}

struct language: Hashable {
    let language: String
    let target: Bool
    let strings: Dictionary<String, string>
}

struct string: Hashable {
    let translation: String
    let pinned: Bool
    let order: Int
}

@State var database = data(
    base: "baseLanguage",
    target: "targetLanguage",
    languages: [
        language(
            language: "language",
            target: true,
            strings: [
                "..." : string(translation: "...", pinned: false, order: 0)
            ]
        )
    ]
)
struct数据:可散列{
让基础:字符串
让目标:字符串
让语言:数组
}
结构语言:Hashable{
让语言:字符串
让目标:布尔
让字符串:字典
}
结构字符串:可哈希{
让翻译:字符串
让我想想:布尔
订单号:Int
}
@状态变量数据库=数据(
base:“baseLanguage”,
目标:“目标语言”,
语言:[
语言(
语言:“语言”,
目标:正确,
字符串:[
“…”:字符串(翻译:“…”,固定:false,顺序:0)
]
)
]
)

基于鼓励使用结构的评论,我建议将此作为我自己问题的答案。此数据变量的内容与原始post相同,但已重新格式化为使用结构

struct data: Hashable {
    let base: String
    let target: String
    let languages: Array<language>
}

struct language: Hashable {
    let language: String
    let target: Bool
    let strings: Dictionary<String, string>
}

struct string: Hashable {
    let translation: String
    let pinned: Bool
    let order: Int
}

@State var database = data(
    base: "baseLanguage",
    target: "targetLanguage",
    languages: [
        language(
            language: "language",
            target: true,
            strings: [
                "..." : string(translation: "...", pinned: false, order: 0)
            ]
        )
    ]
)
struct数据:可散列{
让基础:字符串
让目标:字符串
让语言:数组
}
结构语言:Hashable{
让语言:字符串
让目标:布尔
让字符串:字典
}
结构字符串:可哈希{
让翻译:字符串
让我想想:布尔
订单号:Int
}
@状态变量数据库=数据(
base:“baseLanguage”,
目标:“目标语言”,
语言:[
语言(
语言:“语言”,
目标:正确,
字符串:[
“…”:字符串(翻译:“…”,固定:false,顺序:0)
]
)
]
)

好多了。永不回头;)请注意:

  • 结构的第一个字母应大写。(如果你不这么做,林特会开枪的。)
  • 有时可以嵌入结构,以强制作用域。这取决于你,取决于情况
  • 您不必使用数组和字典符号。喜欢括号
  • 实际上并不建议定义“字符串”数据类型,因为它已经定义了基元类型。请注意,可以在引号之间使用“String”来重新定义范围中的基元类型,但这是一种不好的做法
struct数据:可散列{
结构文本:可哈希{
让翻译:字符串
让我想想:布尔
订单号:Int
}
结构语言:Hashable{
让语言:字符串
让目标:布尔
let Text:[字符串:Text]
}
让基础:字符串
让目标:字符串
让语言:[语言]
}
如果需要使用
文本
在外部键入:

var text: Data.Text

最后,在
语言
类型中定义翻译数组有点奇怪。也许你应该给它命名为
Translations
,并用不同的结构。例如,有一个
Text
struct,其中包含一个
Translations
dict,其中语言代码是键。只是一个建议。。祝你好运:)

好多了。永不回头;)请注意:

  • 结构的第一个字母应大写。(如果你不这么做,林特会开枪的。)
  • 有时可以嵌入结构,以强制作用域。这取决于你,取决于情况
  • 您不必使用数组和字典符号。喜欢括号
  • 实际上并不建议定义“字符串”数据类型,因为它已经定义了基元类型。请注意,可以在引号之间使用“String”来重新定义范围中的基元类型,但这是一种不好的做法
struct数据:可散列{
结构文本:可哈希{
让翻译:字符串
让我想想:布尔
订单号:Int
}
结构语言:Hashable{
让语言:字符串
让目标:布尔
let Text:[字符串:Text]
}
让基础:字符串
让目标:字符串
让语言:[语言]
}
如果需要使用
文本
在外部键入:

var text: Data.Text

最后,在
语言
类型中定义翻译数组有点奇怪。也许你应该给它命名为
Translations
,并用不同的结构。例如,有一个
Text
struct,其中包含一个
Translations
dict,其中语言代码是键。只是一个建议。。祝你好运:)

这件事不要用字典。创建你自己的结构。我研究过创建一个结构,但我没有看到在字典上使用它的意义。现在你明白了。如果使用结构,则不会在查找字典的类型时陷入困境。。这是否回答了您的问题?您想要的类型是[String:Any]。因为有一个字符串和一个数组作为一个字符串键的值。因此,没有其他方法来描述一个类型,它可以有数组或字符串,而不是任何数组或字符串。你可以用struct,不要用字典。创建你自己的结构。我研究过创建一个结构,但我没有看到在字典上使用它的意义。现在你明白了。如果使用结构,则不会在查找字典的类型时陷入困境。。这是否回答了您的问题?您想要的类型是[String:Any]。因为有一个字符串和一个数组作为一个字符串键的值。因此,没有其他方法来描述一个类型,它可以有数组或字符串,而不是任何数组或字符串。你可以直接使用struct。好多了:)我在下面的另一个答案中给你一些提示。也许你可以用它。好多了:)我在下面的另一个答案中给你一些提示。也许你是米格