Array.map()产生'[T]',而不是预期的上下文结果类型''String:Any?]'

时间:2017-02-04 08:25:06

标签: ios swift firebase firebase-realtime-database eureka-forms

我正在编写一个扩展来桥接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?]'

3 个答案:

答案 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] 。它将两个参数传递给它的函数。第一个是“累加器”,我们不断建立最终结果,在这种情况下是另一个字典。第二个是原始字典的元素,表示为名为reducekey的键值对的元组

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函数,而且需要更多代码才能完成。

希望这有帮助!