将 [Dictionary<String,Any?>] 转换为 [Dictionary<String,Any!>] ?迅速 3

Posted

技术标签:

【中文标题】将 [Dictionary<String,Any?>] 转换为 [Dictionary<String,Any!>] ?迅速 3【英文标题】:convert [Dictionary<String,Any?>] to [Dictionary<String,Any!>] ? swift 3 【发布时间】:2016-11-30 15:17:11 【问题描述】:

我正在尝试将[Dictionary&lt;String,Any!&gt;] 附加到[Dictionary&lt;String,Any?&gt;]

但我不断收到此错误:

无法将 [Dictionary] 类型的值转换为 [Dictionary] 的预期参数类型

虽然swift2 没有出现这个编译错误。

这是我的代码:

class A

     var statistics = [Dictionary<String,Any!>]();

     func1()


       let oldStatiscs = self.func2()
       //i am getting the error here.
       self.statistics.append(oldStatiscs)


    

    func2 () -> [Dictionary<String,Any?>]


   


为什么我在 swift3 上收到此错误?为什么我用 swift2 没有这个错误? 这个问题怎么解决?

谢谢

【问题讨论】:

Swift 中的任何可选值——在 Objective-C 中甚至是不允许的——字典是无意义的,因为根据定义,nil 值意味着缺少键,您可以通过分配 @ 来删除键987654326@值。 @vadian 感谢您的评论,是的,我知道,但目前我无法将其更改为 Dictionary 。我的问题有什么解决办法吗? [Dictionary&lt;String,Any!&gt;] 在 Swift 3 中作为变量类型是非法的(它只能存在于少数地方)。你必须改变它。如果你不能改变它,你就不能升级到 Swift 3。你还没有看到错误,但是如果你修复了所有其他的错误,你最终会遇到“隐式展开的选项只允许在顶层和作为函数结果。”你不能再使用这种类型了(这在 Swift 2 中是无稽之谈;在 Swift 3 中是非法的)。 @david 你为什么不能把Dictionary&lt;String,Any?&gt;改成Dictionary&lt;String,Any&gt; @maddy 感谢您的回答,因为在我的代码中我可能会附加 nil 值,我现在无法检查所有数千个案例以确保没有附加 nil。我不明白为什么苹果在 swift 3 中改变了这一点? 【参考方案1】:

首先,即使您将两个字典数组都更改为[Dictionary&lt;String,Any&gt;],您仍然会遇到类似的错误。您正在尝试将数组附加到数组。所以你首先需要改变:

self.statistics.append(oldStatiscs)

到:

self.statistics.append(contentsOf: oldStatiscs)

但即使进行了更改,您也无法将 [Dictionary&lt;String,Any?&gt;] 数组附加到 [Dictionary&lt;String,Any!&gt;] 数组中。

最简单的解决方案是将[Dictionary&lt;String,Any!&gt;] 数组更改为[Dictionary&lt;String,Any?&gt;] 数组。

然后你会得到以下工作代码:

class A 
    var statistics = [Dictionary<String,Any?>]();

    func f1() 
        let oldStatiscs = self.f2()
        statistics.append(contentsOf: oldStatiscs)
    

    func f2() -> [Dictionary<String,Any?>] 
        return [["Hi":"There"]]
    

更好的是摆脱Any?并使用Any

class A 
    var statistics = [Dictionary<String,Any>]();

    func f1() 
        let oldStatiscs = self.f2()
        statistics.append(contentsOf: oldStatiscs)
    

    func f2() -> [Dictionary<String,Any>] 
        return [["Hi":"There"]]
    

您需要解释为什么您认为不能将Any? 更改为Any

【讨论】:

以上是关于将 [Dictionary<String,Any?>] 转换为 [Dictionary<String,Any!>] ?迅速 3的主要内容,如果未能解决你的问题,请参考以下文章

如何将 List<Dictionary<string, byte[]> 对象添加到 Dictionary<string, byte[]> [重复]

C# 将 List<string> 转换为 Dictionary<string, string>

将 XML 转换为 Dictionary<String,String>

WPF MVVM 将 Dictionary<String, List<String>> 绑定到数据网格

将 Dictionary<string, string> 转换为 xml 的简单方法,反之亦然

无法将 Dictionary<string, List<string>> 转换为 IReadOnlyDictionary<string, IReadOnlyCollect