在下面的代码示例中
import UIKit
struct Language: Hashable {
let name: String
}
enum Section {
case main
}
class ViewController: UIViewController, UITableViewDelegate {
var tableView: UITableView!
private typealias DataSource = UITableViewDiffableDataSource<Section, Language?>
private var dataSource: DataSource!
override func viewDidLoad() {
super.viewDidLoad()
// Set up the table view
tableView = UITableView(frame: view.bounds)
view.addSubview(tableView)
// Register a simple cell
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
// Set up the data source
dataSource = DataSource(tableView: tableView) { tableView, indexPath, language in
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
// Check if the language is nil and configure the cell accordingly
if let language = language {
cell.textLabel?.text = language.name
} else {
cell.textLabel?.text = "No Language"
}
return cell
}
// Set up the snapshot with some sample data including nil
var snapshot = NSDiffableDataSourceSnapshot<Section, Language?>()
snapshot.appendSections([.main])
snapshot.appendItems([Language(name: "English"), nil, Language(name: "Spanish"), Language(name: "French")])
// Apply the snapshot to the data source
dataSource.apply(snapshot, animatingDifferences: true)
tableView.delegate = self
}
}
我收到运行时错误
Could not cast value of type 'NSNull' (0x1ec78e900) to 'xxx.Language' (0x1008e0468).
UITableViewDiffableDataSource
不支持nil
吗?我找不到https://developer.apple.com/documentation/uikit/uitableviewdiffabledatasource谈论这个限制。
谢谢。
NSDiffableDataSourceSnapshot
的文档指出:
重要
您的每个部分和项目都必须具有符合 Hashable 协议的唯一标识符。
nil
无法满足这个要求。
因为
UITableView
是Objective-C,所以nil
被翻译成特殊的单例NSNull
,同样无法满足这个要求。 NSNull
也无法转换为 Language
的实例,这是您收到的错误。
虽然文档没有明确声明您不能添加
nil
,但项目具有唯一标识符的要求强烈暗示了这一点。
事实上,使用可选作为项目类型是应该标记的错误。这没有道理。您的快照是存在的项目。如果某个项目不存在,您只需不要将其添加到快照中