我开始使用swiftLint,并注意到Swift的最佳实践之一是避免强制施放。但是我在处理tableView,cell的collectionView时经常使用它:
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(cellID, forIndexPath: indexPath) as! MyOffersViewCell
如果这不是最佳实践,那么处理此问题的正确方法是什么?我猜我可以使用if with as ?,但这是否意味着在其他情况下我需要返回一个空单元格?可以接受吗?
if let cell = collectionView.dequeueReusableCellWithReuseIdentifier(cellID, forIndexPath: indexPath) as? MyOffersViewCell { // code } else { // code }
这个问题可能是基于观点的,所以我的回答有些含糊,但是我不会说强制降压 总是 不好的。您只需要考虑语义以及在给定情况下的语义。
as! SomeClass是一个合同,它基本上说“我保证这件事是SomeClass的一个实例”。如果事实证明它不是SomeClass,则将因为您违反合同而引发异常。
as! SomeClass
您需要考虑使用此合同的环境,以及如果不使用强制降价可以采取什么适当的措施。
在您给出的示例中,如果dequeueReusableCellWithIdentifier 没有 给出a,MyOffersViewCell则可能是您对单元重用标识符进行了错误配置,并且异常将帮助您发现该问题。
dequeueReusableCellWithIdentifier
MyOffersViewCell
如果您使用了条件下调,那么您将得到零,并且必须以某种方式进行处理- 记录一条消息?抛出异常?它肯定代表着不可恢复的错误,是您在开发过程中想要找到的错误。发布后,您就不必再处理了。您的代码不会突然开始返回不同类型的单元格。如果只是让代码在强制向下转换时崩溃,它将直接指向发生问题的行。
现在,考虑一种情况,您正在访问从Web服务检索到的JSON。Web服务中可能存在无法控制的更改,因此,更优雅地处理此问题可能会很好。您的应用可能无法运行,但至少您可以显示警报,而不仅仅是崩溃:
不好-如果JSON不是数组则崩溃
let someArray=myJSON as! NSArray ...
更好-使用警报处理无效的JSON
guard let someArray=myJSON as? NSArray else { // Display a UIAlertController telling the user to check for an updated app.. return }