代码之家  ›  专栏  ›  技术社区  ›  Oleksandr Matrosov

Swift将不同类型组合到一个数组中,以显示UITableView的数据

  •  1
  • Oleksandr Matrosov  · 技术社区  · 5 年前

    var songsGroups = [SongGroup] . 这实际上是我的数据源。

    SongGroup 包含几个属性:

    var categoryName: String
    var songs: [Songs]
    

    但问题出现在下一个层面。我每次都需要检查indexPath.section并执行以下操作:

    if indexPath.section == 0 {
    // this is a section for ADD NEW SONG BUTTON cell no need in header title as there is no data repression only static text on the cell.
    } else {
    var musicCategoryName = songsGroups[indexPath.seciton - 1]. categoryName
    headerTitle.title = musicCategoryName
    }
    

    正如你所看到的,我的代码通过添加这个很酷的 -1

    当然,我可以尝试将我的AddNewSong按钮部分(通过添加一些附加对象)与 songsGroups 数组并为此创建NSArray。就像你记得的Objective-C一样。因此,我的数据源数组将如下所示:

    some NSArray = ["empty data for first cell", songsGroups[0], songsGroups[1]... etc]
    

    但我在这里看到的问题是,我们没有使用显式类型的数组,这很令人不安。

    1 回复  |  直到 5 年前
        1
  •  5
  •   pckill Prabhat Pandey    5 年前

    您可以引入助手枚举:

    enum Section {
        case empty
        case songCategory(categoryName: String, songs: [String])
    }
    

    let datasource: [Section] = [.empty, .songCategory(categoryName: "Category1", songs: ["Song 1", "Song2"])]
    

    所以现在你可以使用 pattern matching

    let section = datasource[indexPath.section]
    if case let .songCategory(categoryName, songs) = section {
        headerTitle.title = categoryName
    } else {
        // this is a section for ADD NEW SONG BUTTON cell no need in header title as there is no data repression only static text on the cell.
    }
    
        2
  •  1
  •   Reinhard Männer    5 年前

    1) 它允许用户通过点击按钮添加新歌

    如果是这样的话,为什么不把“添加新歌曲”按钮放在 table header view ,以及用作数据源的2维阵列中的所有歌曲组和歌曲?