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