核心代码
  
  section.removeAll {baseRow in
  
  if let habitRow = baseRow as? HabitRow{
  
  let idxPath = habitRow.indexPath!
  
  return willRemoveIdxPaths.contains(idxPath)
  
  }
  
  return false
  
  以上代码片段的功能是删除willRemoveIdxPaths队列中对应的所有Rows。Row对应着一个Cell,Cell是Eureka中对UITableViewCell的包装。那么上面实际是将指定的Cells从UITableView中删除。
  
  核心问题
  
  为什么要用removeAll(where:)方法去删除Rows,而不是用遍历删除的方法?比如说如下代码:
  
  for idxPath in willRemoveIdxPaths{
  
  section.remove(at: idxPath.row)
  
  原因是:遍历删除的方法在删除多个Row时行为并不正确!
  
  道理很简单,当删除掉一个Row后,其他Row的索引会发生变化,那么其他待删除的索引就会指向错误的Row。
  
  举个栗子:比如我要一次性删除0和1位置两个Row,但是当我删除掉0位置的Row后,原来1位置的Row会上升到位置0,原来2位置的Row会上升到位置1;接下来我再删除位置1的Row,实际删除的却是原来位置2的Row。
  
  那么问题又来了:为什么removeAll(where:)可以正确删除多个Row?
  
  这个答案先不揭晓,它会随着本猫的叙述逐渐明朗,现在暂且相信本猫它可以满足一次性删除多个Row的功能。
  
  使用场景一 :Xcode 10+ Swift 4.2
  
  删除代码工作良好
  
  使用场景二 :Xcode 9.2 Swift 4.1
  
  提示找不到removeAll(where: www.furggw.com)方法!!!
  
  提示找不到removeAll(where: www.mhylpt.com/)方法!!!
  
  提示找不到removeAll(where:)方法!!!
  
  但是removeAll()方法是存在的!
  
  为了能够更好地解释为什么找不到这个方法,我们首先要搞清楚,这个方法是从哪里来的?
  
  线索一 removeAll(where:) Where Are You From???
  
  从Apple官网查询一下:
  
  https://www.dfgjpt.com/ developer.apple.com/ www.gcyl152.com documentation/swift/rangereplaceablecollection/3018275-removeall
  
  为了方便讨论,直接看搜索结果
  
  从上面我们了解到2点:
  
  该方法只在Xcode 10.0+才可以使用
  
  该方法是RangeReplaceableCollection协议的一部分
  
  这是一个好的开头,不是么?(这是原创文章,虽然这段话很像翻译的…)
  
  线索二 Section到底是什么?为什么包含removeAll方法?
  
  因为Eureka是开源的,所以这个问题的答案颇为简单:它几乎什么都不是!
  
  它不继承于任何类,包含的所有Row或Cell你几乎都不能直接操作;它内部实现了一个KVOWrapper类,用于处理Row各种修改的细节。
  
  那么问题又来了:它为什么可以有removeAll或removeAll(where:)方法?
  
  从线索一中不难推断答案:因为它遵守RangeReplaceableCollection协议!
  
  所以它包含集合操作的N种方法:
  
  看到这大家都应该明了:
  
  Xcode 9.2中之所以找不到removeAll(where:)方法是因为Xcode 9.2(或者Swift 4.1)中的RangeReplaceableCollection协议没有这个方法!
  
  可是在查看Section类源代码时发现,它即使在Xcode www.gcyL157.com 10.0中也没有实现removeAll(where:)方法,所以我们又可以得出推论:
  
  removeAll(where:)方法是RangeReplaceableCollection协议扩展自动为你生成的!你可以免费使用这个方法,只要你遵守RangeReplaceableCollection协议,且在Swift 4.2+中。
  
  更多问题 Come On! www.michenggw.com!!
  
  至此为止,我们得到了一些线索,有了一些新的认识。但是还有两个重要问题没有解决:
  
  1.为什么免费的removeAll(where:)方法可以做到一次性正确删除多个Row?它和遍历删除到底有什么不同?
  
  2.我们如何在Swift 4.1中自己实现这个方法?

最新文章

  1. Nodejs之MEAN栈开发(六)---- 用Angular创建单页应用(上)
  2. 关于在Linux64位下安装xampp
  3. hdu4044 GeoDefense
  4. /etc/rc.d/与/etc/rc.d/init.d的关系
  5. iOS - PassData
  6. Properties类与读取properties文件
  7. 增强学习贪心算法与Softmax算法
  8. JVM内存回收机制
  9. Altium自定义的快捷键设置
  10. windows和centos用cutycapt截网页的图
  11. RSA JS 加密解密DEMO
  12. [HNOI 2009]梦幻布丁
  13. VirtualBox安装linux
  14. Linux NFS挂载
  15. Android 二维码扫描/生成
  16. 6.26 py GIL
  17. 数据库---初识sql语句
  18. css与html 与js的基础语法
  19. Djang的model创建的字段和参数复习
  20. fisher精确检验(fisher’s exat test)和超几何分布

热门文章

  1. udp回显客户端发送的数据
  2. 解决php文字及图片显示乱码的问题
  3. PHP siege 压测 QPS大小
  4. 为 vsftpd 启动 vsftpd:500 OOPS: SSL: cannot load RSA&nb
  5. 插入排序算法Java实现
  6. Android面试收集录10 LruCache原理解析
  7. 有哪些值得一读的优秀开源 JS 代码
  8. 利用NSAttributedString实现图文混排
  9. 为什么要搞vim
  10. 问题:JFinal框架使用FreeMarker渲染视图报错