【问题标题】:SWIFT - Cannot assign value of type '[(String, [String : Any])]' to type '[String : [String : Any]]'SWIFT - 无法将类型“[(String,[String:Any])]”的值分配给类型“[String:[String:Any]]”
【发布时间】:2016-10-12 06:08:38
【问题描述】:

如何去掉第一个值上的“()”,以便分配给下一个变量?

这就是我初始化字典的方式:

var imagedata: [String: [String: Any]] = [:]

我将数据加载到字典中,然后对它进行排序

imagedata = Array(imagedata).sort({ $0.0 < $1.0 })

但它给了我一个 '[(String, [String : Any])]' 类型的值而不是 '[String : [String : Any]]' 所以它不能被分配。

【问题讨论】:

  • Array(imagedata)里面的imagedata变量的数据结构是什么?
  • 字典根据定义是无序的,“假排序”的结果是元组数组而不是字典。
  • 这是 imagedata: ["10October201611": ["images": [, {500, 500}, , {1024, 768}], "count ": 2, "date": "Monday:10-October-2016-11:14:48AM"], ..."10October201608": ["images": [, {1024, 768}, , {1024, 768}], "count": 2, "date": "Monday:10-October-2016-08:18:52PM"]]

标签: arrays swift string sorting


【解决方案1】:

var imagedata: [String: [String: Any]] = [:] //imagedata 是一个字典。

imagedata = Array(imagedata).sort({ $0.0 &lt; $1.0 }) 在这里,您已将 imagedata 添加到 Array 并进行了排序。因为我们不能对字典进行排序。

sort({ $0.0 &lt; $1.0 }) 的结果将是具有原始数组对象类型的数组。所以它返回[(String, [String : Any])]。所以我们不能分配给 imagedata 变量。

实际上Array(imagedata).sort({ $0.0 &lt; $1.0 }) 什么都不做。因为数组只有一个对象。所以它返回相同的东西。

【讨论】:

    【解决方案2】:

    您对其进行排序,但您不能像这样将结果存储回imagedata,因为Array(imagedata).sort({ $0.0 &lt; $1.0 }) 创建了一个(排序后的)array,而imagedata 的类型为dictionary

    这会给你一个编译错误:imagedata = Array(imagedata).sort({ $0.0 &lt; $1.0 })

    虽然这不会Array(imagedata).sort({ $0.0 &lt; $1.0 })

    这告诉我们,问题不在于排序方法,而在于我们用来存储结果的变量。

    字典有自己的 sort 方法,您可以使用它。 但是尝试将 array(从任何 sort 方法返回的值)分配给 dictionary(@ 987654333@) 总是会失败。

    编辑:

    这是一个示例,说明如何在字典中使用 sort 方法并使用返回值:

    var imagedata: [String: [String: Any]] = [:]
    imagedata["a"] = ["Hello": 2]
    imagedata["b"] = ["World": UIImage()]
    imagedata["c"] = ["Foo": "Bar"]
    imagedata["d"] = ["LifeQuest": 42]
    
    print(imagedata)
    // prints the content of the dictionary. Dictionaries are un-ordered, so you may always get different results here
    // ["b": ["World": <UIImage: 0x60000009ea00>, {0, 0}], "a": ["Hello": 2], "d": ["LifeQuest": 42], "c": ["Foo": "Bar"]]
    
    let orderedKeysAndValues = imagedata.sort({ $0.0 < $1.0 })
    for (key, value) in orderedKeysAndValues {
        print("key: \(key)")
        print("value: \(value)")
    }
    
    // the content of the loop will print
    // key: a
    // value: ["Hello": 2]
    // key: b
    // value: ["World": <UIImage: 0x60000009ba80>, {0, 0}]
    // key: c
    // value: ["Foo": "Bar"]
    // key: d
    // value: ["LifeQuest": 42]
    

    【讨论】:

    • 字典有自己的排序方法。不,他们没有。严格意义上的字典根本无法排序,因为字典是 无序 集合类型。
    • @vadian 是的,他们有Link。虽然返回类型不是dictionary,但您可以在字典中调用sort
    • 链接方法的返回类型是排序数组,而不是字典。这就是我写严格口语的原因。
    • 不过,dictionary 类型的任何对象都有一个sort 方法。它返回什么并不重要。这就是我的观点。 OP 显然正试图通过将字典转换为数组来对其进行排序,这不是必需的。他可以使用sort 方法的返回值,根据需要检索数据。也许我应该更新我的答案以使其清楚。
    • 我从未说过您可以对字典进行排序(并将其分配回去)。我刚刚说过,您可以直接对您反对的字典对象调用 sort。我的回答似乎不够准确,所以我会更新它。
    猜你喜欢
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多