一尘不染

武力真的很糟糕,应该经常避免吗?

swift

我开始使用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
}

阅读 177

收藏
2020-07-07

共1个答案

一尘不染

这个问题可能是基于观点的,所以我的回答有些含糊,但是我不会说强制降压 总是 不好的。您只需要考虑语义以及在给定情况下的语义。

as! SomeClass是一个合同,它基本上说“我保证这件事是SomeClass的一个实例”。如果事实证明它不是SomeClass,则将因为您违反合同而引发异常。

您需要考虑使用此合同的环境,以及如果不使用强制降价可以采取什么适当的措施。

在您给出的示例中,如果dequeueReusableCellWithIdentifier 没有
给出a,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
}
2020-07-07