将字典映射到 TableView 的自定义对象

Mapping Dictionary to custom object for TableView

我们有一个自定义 Plist,其中包含我们要添加到 tableView 的一堆字段的数据。布局是这样的:

Root Array
-- Section (Array)
--- Field (Dictionary)
---- FieldName
---- HasError
---- FieldType
--- Field (Dictionary)
---- FieldName
---- HasError
---- FieldType

有多个部分,每个部分有多个字段。每个字段都是一个字典,稍后我们将其映射到自定义对象类型。例如 'FieldObject'。

我知道我们可以在 'FieldObject' 上创建一个自定义的 initWithDictionary 方法来从每个字典创建一个模型对象。

目前我们得到的相关数据是这样的:

 let tvDataPath = NSBundle.mainBundle().pathForResource("CandRegisterFields", ofType: "plist")
self.tableViewData = NSArray.init(contentsOfFile: tvDataPath!)

我们要做的是将字段的所有字典映射到自定义模型对象中,然后将它们添加回原始 NSArray 数据中作为同一索引中的新对象类型等。是否有quick/easy 如何做到这一点?

为什么要将对象放回 NSArray 中,将 cocoa 对象转换为本机 swift 集合类型不是更好吗?为您的 Field 对象使用结构而不是 class?

例如:

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

var sectionsArray = [[Field]]()
for array in plistArray
{
    guard let array = array as? NSArray else { continue }
    let section = array.flatMap { Field(dictionary: [=11=] as? NSDictionary) }
    sectionsArray.append(section)
}

遍历 plist 中的部分。这些部分中的每一个都是一系列字典。您可以将这些词典中的每一个映射到 Field,这样您的 [NSDictionary] 就会映射到 [Field]。然后您可以将该数组添加到另一个数组以保留数据的初始结构。