2016-11-12 105 views
1

我創建了一個結構體,並且想用我的數據填充它。如何使用Swift3將數據從NSMutableArray填充到結構中

我的結構:

struct CrimeNameSection { 

var firstChar: Character 
var name: [String] 
var detail: [String] 
var time: [String] 


init(firstLetter: Character, object1: [String], object2: [String], object3: [String]) { 

    firstChar = firstLetter // First letter of 'name' 
    name = object1 
    detail = object2 
    time = object3 
} 

我的結構(「firstChar」)的第一個值應持有的第一個字母在「名稱」創造的tableView字母部分,其餘的(「名」,」細節','時間')應該包含我的數據庫中的數據(三列:名稱,詳細信息,時間)。

我的代碼:

var marrCrimesData : NSMutableArray! // Hold the database 

func getSectionsFromData() -> [CrimeNameSection] { 
    guard marrCrimesData != nil else { 
     return [] 
    } 


    var sectionDictionary = [CrimeNameSection]() 
    for crime in marrCrimesData { 
     let crime = crime as! CrimesInfo 
     let firstChar = CrimeNameSection(firstLetter: crime.name[crime.name.startIndex], object1: [crime.name], object2: [crime.detail], object3: [crime.time]) 
     if var names = firstChar { 
      names.append(crime.name) 
      sectionDictionary[firstChar] = names 
     } else { 
      sectionDictionary[firstChar] = [crime.name] 
     } 
    } 

    let sections = sectionDictionary.map { (key, value) in 
     return CrimeNameSection(firstLetter: key, name: value) 
    } 
    let sortedSections = sections.sorted { $0.firstLetter < $1.firstLetter } 

    return sortedSections 
} 

我得到的錯誤所有的地方,我需要我的存儲結構中的數據幫助和按字母順序排序。 謝謝大家

+0

你有什麼樣的錯誤? – Robert

回答

1

考慮

struct Crime { 
    let name: String 
    let detail: String 
    let time: String 
} 

let crimes = [ 
    Crime(name: "Foo", detail: "detail 1", time: "9am"), 
    Crime(name: "Bar", detail: "detail 2", time: "10am"), 
    Crime(name: "Baz", detail: "detail 3", time: "11am"), 
    Crime(name: "Qux", detail: "detail 4", time: "12am") 
] 

一種方法是剛剛建立的第一個字符索引的字典,然後對它進行排序:

var crimeIndex = [Character: [Crime]]() 
for crime in crimes { 
    if let firstCharacter = crime.name.characters.first { 
     if crimeIndex[firstCharacter] == nil { 
      crimeIndex[firstCharacter] = [crime] 
     } else { 
      crimeIndex[firstCharacter]?.append(crime) 
     } 
    } 
} 

let sortedIndex = crimeIndex.sorted { $0.0 < $1.0 } 

上述的優點是,我們可以使用字典有效地找到該部分。如果你真的想使用你自定義的「名稱部分」結構,我首先要使用一個Crime對象的數組(如果你之後決定添加排序的話,可能會使得一個Crime的屬性的不連續陣列變得脆弱)犯罪)。因此,它可能看起來像:

struct CrimeNameSection { 
    let firstCharacter: Character 
    var crimes: [Crime] 
} 

而且因爲我們已經失去了一些Dictionary效率查找索引,並通過手動尋找的部分重複,我會繼續前進,在排序做一個插入這個時間,使我不必再做一個單獨的排序:

var crimeSections = [CrimeNameSection]() 
for crime in crimes { 
    if let firstCharacter = crime.name.characters.first { 
     var hasBeenAdded = false 

     for (index, crimeIndex) in crimeSections.enumerated() { 
      if firstCharacter == crimeIndex.firstCharacter { // if we found section, add to it 
       crimeSections[index].crimes.append(crime) 
       hasBeenAdded = true 
       break 
      } 
      if firstCharacter < crimeIndex.firstCharacter { // if we've passed where the section should have been, insert new section 
       crimeSections.insert(CrimeNameSection(firstCharacter: firstCharacter, crimes: [crime]), at: index) 
       hasBeenAdded = true 
       break 
      } 
     } 

     // if we've gotten to the end and still haven't found section, add new section to end 

     if !hasBeenAdded { 
      crimeSections.append(CrimeNameSection(firstCharacter: firstCharacter, crimes: [crime])) 
     } 
    } 
} 
0

首先你不能實例化一個數組,並繪製了它像一本字典

var sectionDictionary = [CrimeNameSection]() // Here you are init an Array 

對於你也來指定鍵,例如字典,如果該鍵是一個字符串:

var sectionDictionary = [String: CrimeNameSection]() // Dictionary init 

但請注意,密鑰必須是唯一的,這樣字典才能正常工作。
這裏的另一個問題是在你的.MAP函數的構造,因爲您尚未創建您CrimeNameSection一個構造函數,只需要兩個參數:

init(firstLetter: Character, object1: [String], object2: [String], object3: [String]) { 

    firstChar = firstLetter // First letter of 'name' 
    name = object1 
    detail = object2 
    time = object3 
} 

// Another constructor with 2 arguments 
init(firstLetter: Character, object1: [String]) { 

    firstChar = firstLetter // First letter of 'name' 
    name = object1 
    detail = []() 
    time = []() 
} 

如果你不希望使用另一個構造函數,那麼你必須在初始構造函數中爲object2和object3提供默認值。