将Dictionary映射到TableView的自定义对象

时间:2016-08-24 17:26:41

标签: ios swift uitableview nsarray nsdictionary

我们有一个自定义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数据作为同一索引中的新对象类型等。是否有快速/简单的方法吗?

1 个答案:

答案 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]。然后,您可以将该数组添加到另一个数组以保留数据的初始结构。