swift中双层for循环写法(使用 flatMap , compactMap)

现在有一个需求:需要加载本地plist文件中的数据,数据格式如下图所示:

在这里插入图片描述

即:数组里存放2个数组,然后这2个数组又分别存放几个字典。

要加载这些数据你可能首先会想到的就是第一种方式:代码如下

首先定义一个数组存放数据:


    fileprivate  lazy var sections = [[SettingModel]]()

第一种方式:双层for循环

      
        let path = Bundle.main.path(forResource: "settingPlist", ofType: "plist")
        let array = NSArray(contentsOfFile: path ?? "") ?? []
        
        for obj in array
        {
            let arr = obj as! [[String:AnyObject]]
            var sectionArr = [SettingModel]()
            for dict in arr
            {
                let settingModel = SettingModel(JSON: dict)
                guard let model = settingModel else {
                    continue
                }
                sectionArr.append(model)
            }
            sections.append(sectionArr)

       }

当然这种方式可以实现需求,但是却没很好的利用swift中的map函数和flatMap函数

第二种方式:map函数与flatMap结合使用,具体代码如下所示:


        sections =  array.map{ obj in
                        (obj as! [Any]).flatMap{ dict in
                         return SettingModel(JSON: (dict) as! [String:Any])
            }
        }

当然此处的map也可以替换为flatMap,由于定义的属性sections是非可选类型[[SettingModel]],所以第二个则必须使用flatMap,避免此处返回的是可选类型,如果使用map则返回可选类型。

第三种方式:使用compactMap,具体代码如下所示:

    sections =  array.compactMap{ obj in
                    (obj as! [Any]).compactMap{ dict in
                     return SettingModel(JSON: (dict) as! [String:Any])
        }
    }

总结:优先使用第三种方式

在swift中,map,flatMap及compactMap函数还有更加强大功能,大家可以自行学习了解一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章