2016-08-24 43 views
0

我们有一个自定义Plist,其中包含我们添加到tableView的一堆字段的数据。的布局是这样的:将字典映射到TableView的自定义对象

根段列阵
- 章节(阵列)
---字段(词典)
----字段名
---- HasError
--- - 的FieldType
---字段(词典)
----字段名
---- HasError
----的FieldType

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

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

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

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

我们想要做的是地图领域进入自定义模型对象的所有词典,然后将它们重新添加到原NSArray数据新的对象类型在相同的索引等等。有没有一个快速/简单的方法来做到这一点?

+0

为什么你想保留一些东西在数组中,然后将其改为别的东西?这是有原因的吗?为什么不创建一个方法来映射一切,并将其放入数组中所需的格式? –

+0

@Lu_ - 真的,我们只是想要一个模型对象的数组,其他数组可以忽略。所以我们有一个字典数组,我们需要一个模型对象数组。 – StuartM

+0

@Lu_ - 我遇到的问题是for语句循环的语法。即我们从一组数组开始(或者就数据而言一组数组)。我想要循环每个辅助数组以找到所有字典,以映射到对象 – StuartM

回答

1

为什么你想要将对象放回NSArray将可可对象转换为原生的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

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

+0

正是如此,谢谢你,只需要一些语法指针。我的工作方式与NSArray类似,但在您的帮助下得到了他们的帮助,谢谢。我为场模型使用了一个类,因为项可以改变,例如hasError。谢谢 – StuartM

相关问题