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

3

我正在尝试将[Dictionary<String,Any!>]追加到[Dictionary<String,Any?>]

但我一直得到这个错误:

无法将类型为[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中我为什么没有遇到这个错误?如何解决这个问题?
谢谢。

1
在 Swift 中,任何可选值都是无意义的,因为根据定义,nil 值表示缺少键,你可以通过分配 nil 值来删除一个键。而在 Objective-C 中,这甚至是不允许的。 - vadian
@vadian感谢您的评论,是的我知道,但目前我无法将其更改为Dictionary<String,Any>。您有任何解决我的问题的方法吗? - david
1
在Swift 3中,[Dictionary<String,Any!>]作为变量类型是非法的(它只能存在于少数几个地方)。你必须更改它。如果你不能更改它,那么你就无法升级到Swift 3。你还没有看到错误,但如果你修复了所有其他错误,最终会遇到“隐式解包可选项仅允许在顶层和作为函数结果”。你不能再使用这种类型了(在Swift 2中它是无意义的;在Swift 3中它是非法的)。 - Rob Napier
@david 为什么你不能把 Dictionary<String,Any?> 改成 Dictionary<String,Any> - rmaddy
@maddy 谢谢你的回答,因为在我的代码中可能会添加 nil 值,我现在无法遍历所有成千上万个情况以确保没有添加 nil。我不明白为什么苹果在 Swift 3 中改变了这一点? - david
显示剩余2条评论
1个回答

3
首先,即使您将两个字典数组都更改为[Dictionary<String,Any>],您仍会收到类似的错误。您正在尝试将一个数组附加到另一个数组。因此,您需要先更改:
self.statistics.append(oldStatiscs)

to:

self.statistics.append(contentsOf: oldStatiscs)

即使进行了这样的更改,您也无法将[Dictionary<String,Any?>]的数组附加到[Dictionary<String,Any!>]的数组中。

最简单的解决方法是将[Dictionary<String,Any!>]数组更改为[Dictionary<String,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”。
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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接