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函數還有更加強大功能,大家可以自行學習瞭解一下。

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