ios - 在 Swift 中初始化 UITableViewCells 的最佳实践

标签 ios swift uitableview

swift 新手。我有一个名为 "MyTableViewCell" 的自定义 UITableViewCell 代码如下:

let cell = tableView.dequeueReusableCellWithIdentifier("myCell", forIndexPath: indexPath) as! MyTableViewCell

我应该在这里使用 as! 还是 as? 来向下转换?我在某处读到强制向下转换不是好的做法,尽管我看到很多人在其他代码示例中使用它。

我也知道 Swift 会自动推断类型,但最好将其包含在声明中,即:

let cell: MyTableViewCell = tableView.dequeueReusableCellWithIdentifier("myCell", forIndexPath: indexPath) as! MyTableViewCell

关于此的任何指示都会很棒。谢谢!

最佳答案

关于强制向下转型/展开是不好的做法,你是对的,但是在这种情况下,这并不是一件坏事。

您可以在 Storyboard中或通过 registerClass:forCellReuseIdentifier: 显式地将单元格标识符 myCell 注册为 MyTableViewCell 类的实例。

这意味着在构建时,您确切地知道当您向 tableView 请求一个标识符为 myCell 的单元格时,您将返回一个 MyTableViewCell细胞。如果你确实犯了一个错误(可能是打字错误),那么你的应用程序最多在你第一次测试时就会崩溃。您在调试时会发现的东西不太可能成为生产中的问题。

很明显,编译器并不知道这一点,因此您必须将其隐藏起来,但这并不值得担心。


如果您不能至少 99.9% 确定强制向下转型/解包不会导致您的应用程序崩溃,则不适合强制向下转型。例如,也许您正在从 Web 服务返回的字典中提取字符串 let string = dictionary["myString"] as!字符串。在很多情况下,键 myString 可能不包含 Swift 字符串(即 JSON 解析器返回 NSNull,它们的键根本不存在,或者它不是一个String),所以你应该始终确保以安全的方式解包值。

这个故事的寓意是,您应该尽可能避免强制向下转换/展开,但也有一些异常(exception),这就是其中之一。


though I see many people using it in other code examples.

你是对的,你看到很多人在 SO 上提供了写得非常糟糕的 Swift 片段,很多其他人会简单地认为它没问题,所以你质疑它是件好事。

关于ios - 在 Swift 中初始化 UITableViewCells 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34383679/

相关文章:

ios - 无法向数组添加元素

objective-c - UISearchDisplayController 的搜索结果具有与搜索表不同的单元格布局和行为

ios - 如何使用滚动动画关注 UITableview 中的最后一个单元格?

ios - 如果滚动 UITableView 时出现 popViewController,应用程序崩溃

ios - swift 和 xcode 6 中的自定义标签栏

ios - 使用_框架!在 cocoapods 中进行分析

ios - 在应用程序 RTL 中实现不同语言的 Apple 登录按钮

ios - 使用 createOrUpdate 的 Realm 部分更新不起作用

ios - Realm 模型中的单一反向关系

ios - 如何消除多次触摸的冲动(SpriteKit)