Swift 将不同类型组合成一个数组来显示UITableView的数据

Swift combine different type into one array to display data for UITableView

我有 table我需要显示几个部分的视图。您应该将此 table 想象成您歌曲的播放列表。在顶部的第一部分,我需要显示一个带有按钮的单元格,该按钮将向播放列表添加更多歌曲,table视图的其他部分是 header 音乐类别的标题(如流行、摇滚等)。每个部分都包含歌曲名称的单元格。

我有一组这样命名的歌曲: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 神奇数字,我的代码变得神奇了。我重播一点都不喜欢

作为一个确定的想法,我可以尝试将我的“添加新歌曲按钮”部分(通过添加一些额外的 object)与 songsGroups 数组结合起来,并为此目的创建 NSArray。就像你记得的 Objective-C 一样。那么我的数据源数组将如下所示:

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

因此无需检查任何部分,我们可以信任我们的数组来构建所有内容,即使我将添加更多空数据单元格,我也无需通过 if 块处理我的代码并添加大量神奇的数字。

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

所以也许你知道如何解决我的问题的更漂亮的解决方案。

你可以引入一个辅助枚举:

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

您的数据源将如下所示:

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

现在您可以使用 pattern matching 填充 table 视图:

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.
}

我不确定我是否理解正确。但在我看来你想要显示

1) 让用户通过点击按钮添加新歌曲的东西,以及
2) table 首歌曲,分成几组。

如果是这样,为什么不将添加新歌曲按钮放在 table header view 中,并将所有歌曲组和歌曲放在一个 2-dim 数组中用作数据源?