Swift代码报错:无法将NSIndexPath?转换为IndexPath,求解决方法
解决NSIndexPath与IndexPath类型转换错误
问题原因
在Swift 3及后续版本中,UITableView的insertRows(at:with:)和deleteRows(at:with:)方法要求传入Swift原生的IndexPath类型数组,但你的代理方法参数使用的是Objective-C兼容的NSIndexPath?类型,两者属于不同类型,直接强制解包后放入数组会触发类型不匹配错误。
解决方案
有两种可行的处理方式:
方式1:显式转换NSIndexPath为IndexPath(兼容旧版代理方法)
保留原方法签名的前提下,先通过可选绑定安全判断参数是否非nil,再将NSIndexPath转换为IndexPath类型:
func controller(controller: NSFetchedResultsController<NSFetchRequestResult>, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) { switch(type) { case .insert: // 安全处理可选值 + 类型转换 if let newIndexPath = newIndexPath { self.heroTableView.insertRows(at: [newIndexPath as IndexPath], with: .fade) } case .delete: if let indexPath = indexPath { self.heroTableView.deleteRows(at: [indexPath as IndexPath], with: .fade) } default: break } }
方式2:更新代理方法签名为Swift原生类型(推荐)
如果你的项目基于Swift 3+,直接使用Swift版本的NSFetchedResultsController代理方法,参数本身就是IndexPath?类型,无需转换:
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) { switch type { case .insert: if let newIndexPath = newIndexPath { self.heroTableView.insertRows(at: [newIndexPath], with: .fade) } case .delete: if let indexPath = indexPath { self.heroTableView.deleteRows(at: [indexPath], with: .fade) } default: break } }
额外提示
避免使用!强制解包可选值,一旦indexPath或newIndexPath为nil,会直接导致程序崩溃。使用可选绑定if let的方式可以安全处理nil情况。
内容的提问来源于stack exchange,提问作者iThinkBig
相关产品推荐
相关产品推荐

