2016-08-24 81 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