現在有一個需求:需要加載本地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函數還有更加強大功能,大家可以自行學習瞭解一下。