将字典映射到 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]
。然后您可以将该数组添加到另一个数组以保留数据的初始结构。
我们有一个自定义 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]
。然后您可以将该数组添加到另一个数组以保留数据的初始结构。