现在有一个需求:需要加载本地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函数还有更加强大功能,大家可以自行学习了解一下。