我们有一个自定义Plist,其中包含我们要添加到tableView的一堆字段的数据。布局是这样的:
根阵列
- 部分(阵列)
---场(字典)
---- FieldName
---- HasError
---- FieldType
---场(字典)
---- FieldName
---- HasError
---- FieldType
有多个部分,每个部分都有多个字段。每个字段都是一个字典,我们稍后将其映射到自定义对象类型。例如'FieldObject'。
据我所知,我们可以在'FieldObject'上创建一个自定义的initWithDictionary方法,以便从每个字典创建一个模型对象。
目前我们得到的相关数据如下:
let tvDataPath = NSBundle.mainBundle().pathForResource("CandRegisterFields", ofType: "plist")
self.tableViewData = NSArray.init(contentsOfFile: tvDataPath!)
我们要做的是将字段的所有字典映射到自定义模型对象,然后将它们添加回原始NSArray
数据作为同一索引中的新对象类型等。是否有快速/简单的方法吗?
答案 0 :(得分:1)
为什么你想要将对象放回到NSArray
中,最好不要将cocoa对象转换为本机swift集合类型,这样你就可以使用结构而不是类来实现你的Field
对象?
例如:
struct Field
{
let fieldName: String
let hasError: Bool
let fieldType: String //Should actually most likely be an enum
}
extension Field
{
init?(dictionary: NSDictionary?)
{
guard let dictionary = dictionary, let fieldName = dictionary["FieldName"] as? String else { return nil }
let hasError = dictionary["HasError"] as? Bool ?? false
let fieldType = dictionary["FieldType"] as? String ?? ""
self.init(fieldName: fieldName, hasError: hasError, fieldType: fieldType)
}
}
为Field
对象创建结构。有一些将NSDictionary
转换为Field
的init方法。
var sectionsArray = [[Field]]()
for array in plistArray
{
guard let array = array as? NSArray else { continue }
let section = array.flatMap { Field(dictionary: $0 as? NSDictionary) }
sectionsArray.append(section)
}
迭代你的plist中的部分。每个部分都是一个字典数组。您可以将每个词典映射到Field
,以便将[NSDictionary]
映射到[Field]
。然后,您可以将该数组添加到另一个数组以保留数据的初始结构。