在Swift中编写自定义UITableViewCell时强制转发

sss*_*ver 2 cocoa-touch ios swift

在以下代码中:

let cell = tableView.dequeueReusableCell(
    withIdentifier: "MyCell",
    for: indexPath
) as MyTableViewCell  // 'UITableViewCell' is not convertible to 'MyTableViewCell'; did you mean to use 'as!' to force downcast?
Run Code Online (Sandbox Code Playgroud)

我们有错误抱怨UITableViewCell不能转换为MyTableViewCell.

所以编译器建议做一个强制转换:

let cell = tableView.dequeueReusableCell(
    withIdentifier: "MyCell",
    for: indexPath
) as! MyTableViewCell  // ?!?!?!
Run Code Online (Sandbox Code Playgroud)

然而,这感觉很难看.

在处理时没有其他强制施法的选择tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)吗?这真的是在Swift中实现这一目标的最惯用的方式吗?

谢谢!

mat*_*att 5

这真的是最惯用的方式吗?

绝对.这是完全标准的.

可以像这样安全地垂头丧气:

if let cell = tableView.dequeueReusableCell(
   withIdentifier: "MyCell",
   for: indexPath
) as? MyTableViewCell {
Run Code Online (Sandbox Code Playgroud)

但这是我不认为值得做的一种情况,因为如果事实证明这不是一个MyTableViewCell,那么你想要崩溃是非常真实的.

  • @FedericoOjeda`dequeueReusableCell(withIdentifier:forIndexPath:)`总是返回一个非可选的单元格.根据定义,它永远不会失败.非可选值不会崩溃. (2认同)