HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – 使用带有字典的flatMap会产生元组吗?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个非常基本和直接的对象映射到字典.我在顶层使用和解析字典.其中一个字段是一系列其他字典.为了设置它们,我使用flatMap这似乎是一个合适的方法,但由于里面的对象不可为空,这个方法突然返回元组(至少看起来像这样)而不是字典.

我创建了一个最小的例子,几乎可以在任何执行任何地方粘贴到新项目中,这应该提供更好的细节,然后是任何描述:

func testFlatMap() -> Data? {

    class MyObject {
        let a: String
        let b: Int
        init(a: String,b: int) { self.a = a; self.b = b }

        func Dictionary() -> [String: Any] {
            var Dictionary: [String: Any] = [String: Any]()
            DictionarY["a"] = a
            DictionarY["b"] = b
            return Dictionary
        }
    }

    let objects: [MyObject] = [
        MyObject(a: "first",b: 1),MyObject(a: "second",b: 2),MyObject(a: "third",b: 3)
    ]

    var Dictionary: [String: Any] = [String: Any]()
    DictionarY["objects"] = objects.flatMap { $0.Dictionary() }
    DictionarY["objects2"] = objects.map { $0.Dictionary() }

    print("Type of first array: " + String(describing: type(of: DictionarY["objects"]!)))
    print("Type of first element: " + String(describing: type(of: (DictionarY["objects"] as! [Any]).first!)))

    print("Type of second array: " + String(describing: type(of: DictionarY["objects2"]!)))
    print("Type of second element: " + String(describing: type(of: (DictionarY["objects2"] as! [Any]).first!)))

    return try? JSONserialization.data(withJSONObject: Dictionary,options: [])
}
_ = testFlatMap()

所以这段代码崩溃了

(使用do-catch没有区别,这是第一个WTH,但现在让我们离开)

那么让我们看一下日志所说的内容

Type of first array: Array<(key: String,value: Any)>
Type of first element: (key: String,value: Any)
Type of second array: Array<Dictionary<String,Any>>
Type of second element: Dictionary<String,Any>

第二个是我们所期望的,但第一个只有那里的元组.这是自然的,有意的吗?

在你全力以赴“为什么使用flatMap作为非可选值”之前,让我解释一下func Dictionary() – > [String:Any]曾经是func Dictionary() – > [字符串:任何]?因为它跳过了缺少某些数据的项目.

所以只添加那么少?在该方法的最后将输出更改为:

Type of first array: Array<Dictionary<String,Any>>
Type of first element: Dictionary<String,Any>
Type of second array: Array<Optional<Dictionary<String,Any>>>
Type of second element: Optional<Dictionary<String,Any>>

这意味着第一个解决方案是正确的.在变化时,没有任何警告,也没有任何警告.该应用程序将突然开始崩溃.

最后的问题显然是“如何避免这种情况?”没有太多的工作.使用Dictionary [“objects”] = objects.flatMap {$0.Dictionary()}作为[[String:Any]]似乎可以做到保留单行的技巧.但使用它似乎非常愚蠢.

解决方法

我看到你的问题归结为map与flatMap. map是更加一致的,它在预期的方式工作,所以我不会深入研究它.

现在转到flatMap:你的问题是提出SE-0187的原因之一. flatMap有3个重载:

Sequence.flatMap<S>(_: (Element) -> S) -> [s.Element] where S : Sequence
Optional.flatMap<U>(_: (Wrapped) -> U?) -> U?
Sequence.flatMap<U>(_: (Element) -> U?) -> [U]

>当你的Dictionary()函数返回一个非可选项时,它会使用第一个重载.由于字典是一系列键值元组,因此您可以获元组数组.
>当你的Dictionary()函数返回一个可选项时,它使用第三个重载,它基本上过滤掉了nils.这种情况可能非常混乱,因此建议(并接受)SE-0187将此重载重命名为compactMap.

从Swift 4.1(Xcode 9.3,目前处于测试阶段)开始,您可以使用COR_427_11845@pactMap:

// Assuming Dictionary() returns [String: Any]?
DictionarY["objects"] = objects.compactMap { $0.Dictionary() }

对于Swift< 4.1,您提供的解决方案是唯一有效的解决方案,因为它为编译器提供了第三个重载的提示

DictionarY["objects"] = objects.flatMap { $0.Dictionary() } as [[String: Any]]

大佬总结

以上是大佬教程为你收集整理的ios – 使用带有字典的flatMap会产生元组吗?全部内容,希望文章能够帮你解决ios – 使用带有字典的flatMap会产生元组吗?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。