我正在编写一个扩展来桥接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?]'
答案 0 :(得分:6)
您的问题在于map
始终返回Array
这一事实,即使应用于Dictionary
也是如此。您的错误消息基本上意味着,您声明您的方法返回Dicitonary
,但内部语句返回Array
([T]
- 表示对象为 some <的数组类型T)。在您的情况下,map
返回的数组将包含元组(更多关于它们here)。在这种情况下,它看起来像一个键值对,但它不等同于Dictionary中的键值对。基本上,元组使您可以从方法返回多个值/对象。您可以将它们视为匿名结构。
在我看来,没有必要使用map
来完成你需要的东西--Xcoder先生提供的解决方案是可行的方法。
答案 1 :(得分:6)
如果你真的想使用for (Map.Entry<String, List<long[]>> virtuosoMapSingle : virtuosoMap.entrySet()) {
for (long[] virtuosoMapSingleNumbers : virtuosoMapSingle.getValue()) {
System.out.println(virtuosoMapSingleNumbers.get(0));
}
}
这样的功能,那么你真正想要的方法是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
答案 2 :(得分:4)
我无法弄清楚如何修复该错误,也没有通过扩展程序或map()
成功实现所需的结果,但我有一个替代解决方案,使用功能强>:
声明字典:
var date = NSDate()
var swiftDict:[String : Any?] = ["1": date, "2": "two", "3": 15, "4": true]
<强>功能:强>
func firebaseFriendlyDictionary(_ dict: [String : Any?]) -> [String : Any?]{
var Dict = dict
for (key, value) in dict
{
if (value is NSDate){
Dict[key] = (value as! NSDate).timeIntervalSince1970
}
}
return Dict
}
用法:
swiftDict = firebaseFriendlyDictionary(swiftDict)
<强>测试强>
假设我们的日期为2017-02-04 16:42:46 +0000
,则输出为1486226566.2349629
,这是正确的。
为什么不映射字典? 正如 Losiowaty 在他的优秀答案中所指出的那样,map
总是会返回Array
},在这种情况下Array
Tuples([T]
)。在我看来,在这种情况下不需要map函数,而且需要更多代码才能完成。
希望这有帮助!