作者:h38868863 | 来源:互联网 | 2023-02-12 21:37
我正在编写一个扩展来桥接FirebaseDatabase和Eureka之间的字典值.
private extension Dictionary {
func firebaseFriendlyDictionary() -> [String: Any?] {
return self.map({ (key: String, value: Any?) -> (String, Any?) in
if value is NSDate {
return (key, (value as! NSDate).timeIntervalSince1970)
}
return (key, value)
})
}
}
但是当我尝试构建时,我会抛出此错误:
map produces '[T]', not the expected contextual result type '[String: Any?]'
1> Losiowaty..:
你的问题在于这样一个事实,即使应用于a ,它map
总会返回Array
一个Dictionary
.您的错误消息基本上意味着,您将方法声明为返回a Dicitonary
,但语句内部返回一个Array
([T]
- 表示具有某种类型T的对象的Array ).在您的情况下,返回的数组map
将包含元组(这里更多关于它们).在这种情况下,它看起来像一个键值对,但它不等同于Dictionary中的键值对.基本上,元组使您可以从方法返回多个值/对象.您可以将它们视为匿名结构.
在我看来,没有必要使用a map
来完成你需要的东西--Xcoder先生提供的解决方案是要走的路.
标记为正确答案,以便清楚地解释.简而言之:元组数组≠字典...`[(String,Any?)]≠[String:Any?]`.谢谢!
2> matt..:
如果你真的想要使用类似功能的东西map
,你真正想要的方法是reduce
.
我会证明.为了使事情尽可能清楚,我认为如果我们将您的价值观所经历的转变分离出来,将会有所帮助:
func dateToSeconds(_ thing:Any?) -> Any? {
guard let date = thing as? Date else {return thing}
return date.timeIntervalSince1970
}
好的,所以这是我们的测试词典:
let d1 : [String:Any?] = ["1":Date(), "2":"two", "3":15, "4":true]
现在我们准备申请了reduce
.它将两个参数传递给它的函数.第一个是"累加器",我们不断建立最终结果,在这种情况下是另一个字典.第二个是原始词典的一个元素,表示为元组称为键-值对的key
和value
:
let d2 = d1.reduce([String:Any?]()) { (dict, tuple) in
var dict = dict
dict[tuple.key] = dateToSeconds(tuple.value)
return dict
}
当我们检查时d2
,我们看到我们得到了正确的答案:
d2 // ["3": {some 15}, "2": {some "two"}, "1": {some 1486228695.557882}, "4": {some true}]
我不知道你在做什么,但我向你展示的确有效.请注意,在我的`reduce`函数的第一行,我将`dict`分配给`var`; 那是你在说什么?这条线至关重要.(嗯,这一切都至关重要;它们都在一起.)