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

Mat*_*der 3 arrays uitableview nsarray ios swift

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

我的歌曲叫一个这样的数组:var songsGroups = [SongGroup]。这实际上是我的数据源。

SongGroup 包含几个属性:

var categoryName: String
var songs: [Songs]
Run Code Online (Sandbox Code Playgroud)

但问题出现在下一个层面。我每次都需要检查 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
}
Run Code Online (Sandbox Code Playgroud)

正如你看到的,通过添加这个很酷的-1神奇数字,我的代码变得神奇了。我重播根本不喜欢。

作为一个肯定的想法,我可以尝试将我的 ADD NEW SONG BUTTON 部分(通过添加一些额外的对象)与songsGroups数组结合起来,并为此目的创建 NSArray。就像你记得的那样在 Objective-C 中。那么我的数据源数组将如下所示:

some NSArray = ["empty data for first cell", songsGroups[0], songsGroups[1]... etc]
Run Code Online (Sandbox Code Playgroud)

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

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

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

pck*_*ill 5

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

enum Section {
    case empty
    case songCategory(categoryName: String, songs: [String])
}
Run Code Online (Sandbox Code Playgroud)

您的数据源将如下所示:

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

所以现在你可以使用模式匹配来填充表格视图:

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.
}
Run Code Online (Sandbox Code Playgroud)