2017-05-21 2 views
0

私はプロジェクトでインデックステーブルを表示する必要がある状況があります。だから、私はセクションヘッダータイトルとインデックスのための動的配列を作成しています。私は配列を作成しましたが、この配列を並べ替えることができません。私はこのような1つのオブジェクトを持っています:配列のソートがソートされない、ソート関数の後に型が変更される

struct StorageData { 
    var id: String? 
    var version: Int? 
    var downloadDate: Date? 
    var legId: String? 
    var packageId: String? 
} 

そして、私はサーバからこれの配列を取得しています。だから私は2つの配列を作成しました。

var tableViewSource = [Character : [StorageData]]() 
var tableViewHeaders = [Character]() 

と、この文によってこれらの配列を埋めるためにしよう:

func getTableData(words: [StorageData]) { 
    tableViewSource = createTableData(wordList: words).source 
    tableViewHeaders = createTableData(wordList: words).firstSymbols 
} 

    func createTableData(wordList: [StorageData]) -> (firstSymbols: [Character], source: [Character : [StorageData]]) { 

    // Build Character Set 
    var firstSymbols = Set<Character>() 

    func getFirstSymbol(word: String) -> Character { 
     return word[word.startIndex] 
    } 

    wordList.forEach {_ = firstSymbols.insert(getFirstSymbol(word: $0.name!)) } 

    // Build tableSourse array 
    var tableViewSource = [Character : [StorageData]]() 
    let sortedSymbols = firstSymbols.sorted(by: {$0 < $1}) 

    for symbol in sortedSymbols { 

     var words = [StoragePersonal]() 

     for word in wordList { 
      let data = word.name 
      if symbol == getFirstSymbol(word: data!) { 
       words.append(word) 
      } 
     } 
     tableViewSource[symbol] = words.sorted(by: {$0.name! < $1.name!}) 
    } 

    return (sortedSymbols, tableViewSource) 
} 

が、tableViewSource内のデータがソートされていない来ています。

答えて

0

データをセクションに分割したいと思います。

データ型StoragePersonalについては混乱していますが、それはStorageDataの子です。そうではありません。 そしては、StorageData構造のnameプロパティを表示しません。

私は、変更すべきだと思う:

func getTableData(words: [StorageData]) { 
    tableViewSource = createTableData(wordList: words).source 
    tableViewHeaders = createTableData(wordList: words).firstSymbols 
} 

へ:

func getTableData(words: [StorageData]) { 
    let result = createTableData(wordList: words) 
    tableViewSource = result.source 
    tableViewHeaders = result.firstSymbols 
} 

私はあなたのためのデータを分離するために新しい関数を作成しました:

func createTableData(wordList: [StorageData]) -> (firstSymbols: [Character], source: [Character : [StorageData]]) 
{ 
    var tableViewSource = [Character : [StorageData]]() 
    var firstSymbols = [Character]() 

    // first, sort wordList 

    let sortedWordList = wordList.sorted { 
     if let name1 = $0.name { 
      if let name2 = $1.name { 
       let compareResult = name1.localizedCaseInsensitiveCompare(name2) 
       if compareResult == ComparisonResult.orderedSame || compareResult == ComparisonResult.orderedAscending { 
        return true 
       } 
      } 
     } 

     return false 
    } 

    // second, separate words into section by the first character 

    var previousCharacter = Character("A") 
    var previousWords = [StorageData]() 
    var otherWords = [StorageData]() 

    for word in sortedWordList { 
     if let name = word.name { 
      let upperCaseName = name.uppercased() 
      if let firstCharacter = upperCaseName.characters.first { 
       if (firstCharacter < Character("A")) || (firstCharacter > Character("Z")) { 
        // other word (numbers, special characters, ...) 
        otherWords.append(word) 
       } else if firstCharacter == previousCharacter { 
        previousWords.append(word) 
       } else { 
        // save a section 
        if previousWords.count > 0 { 
         tableViewSource[previousCharacter] = previousWords 
         firstSymbols.append(previousCharacter) 
        } 

        // start new section 
        previousCharacter = firstCharacter 
        previousWords.removeAll() 
        previousWords.append(word) 
       } 
      } 
     } 
    } 

    // save the last normal section 

    if previousWords.count > 0 { 
     tableViewSource[previousCharacter] = previousWords 
     firstSymbols.append(previousCharacter) 
    } 

    // save the other section 

    tableViewSource["#"] = otherWords 
    firstSymbols.append("#") 

    return (firstSymbols, tableViewSource) 
} 
関連する問題