UITableViewDiffableDataSource不支持nil吗?

问题描述 投票:0回答:1

在下面的代码示例中

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谈论这个限制。

谢谢。

swift uikit
1个回答
0
投票

NSDiffableDataSourceSnapshot
的文档指出:

重要

您的每个部分和项目都必须具有符合 Hashable 协议的唯一标识符。

nil
无法满足这个要求。

因为

UITableView
是Objective-C,所以
nil
被翻译成特殊的单例
NSNull
,同样无法满足这个要求。
NSNull
也无法转换为
Language
的实例,这是您收到的错误。

虽然文档没有明确声明您不能添加

nil
,但项目具有唯一标识符的要求强烈暗示了这一点。

事实上,使用可选作为项目类型是应该标记的错误。这没有道理。您的快照是存在的项目。如果某个项目不存在,您只需不要将其添加到快照中

© www.soinside.com 2019 - 2024. All rights reserved.