Swift中由找不到removeAll(where:)方法引起的连锁反应(上)
核心代码
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中自己实现这个方法?
Swift中由找不到removeAll(where:)方法引起的连锁反应(上)的更多相关文章
- Swift中enum, struct, class的有关使用方法
import Foundation print("Hello, World!") let a = var b = var c = a + b; c = //重载:函数名相同, 函数 ...
- 来自lombok的注解(解决idea中的找不到get,set方法,找不到log的问题)
今天看代码,发现idea报错,仔细一看调用的get,set方法bean中都没有,但是运行起来却没有问题,这个让我很疑惑.后来发现在类上有一个以前没见过的注解@Data,大概就是因为有他的原因.这个注解 ...
- Swift中的数组
学习来自<极客学院:Swift中的字符串和集合> 工具:Xcode6.4 直接上基础的示例代码,多敲多体会就会有收获:百看不如一敲,一敲就会 import Foundation //数组: ...
- Swift中 @objc 使用介绍
在swift 中 如果一个按钮添加点击方法 如果定义为Private 或者 定义为 FilePrivate 那么会在Addtaget方法中找不到私有方法 但是又不想把方法暴露出来,避免外界访问 ,那 ...
- Swift基础--通知,代理和block的使用抉择以及Swift中的代理
什么时候用通知,什么时候用代理,什么时候用block 通知 : 两者关系层次太深,八竿子打不着的那种最适合用通知.因为层级结构深了,用代理要一层一层往下传递,代码结构就复杂了 代理 : 父子关系,监听 ...
- Swift 中的getting和setter的使用
以下简单的介绍Swift中的getting和setting的使用方法: Xcode version: 6.1 先附代码: class Test { var num1: Double = 0.0 ini ...
- UISegmentedControl在Swift中的使用
UISegmentedControl控件是分段显示控件,用户可以选择它上展示的任一段部分,每一个部分都像是一个按钮,如果被按下也会像UIButton一样执行相应的方法.在这篇文章中我们将创建一个UIS ...
- 把Swift中的String转成NSString ,获取NSString的方法
1.0 在Swift中的 String 并没有提供什么方法,直接把它自身转变成 Int .Float 等,而在OC中我们就可以这样 "123".integerValue 来获取它 ...
- Swift 中枚举
Swift 中枚举高级用法及实践 字数11017 阅读479 评论0 喜欢20 title: "Swift 中枚举高级用法及实践"date: 2015-11-20tags: [AP ...
随机推荐
- Dijkstra&&Floyd
文章来源:(http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html) (以下内容皆为转载) Dijkstra算法 1.定义 ...
- centos 7忘记了root密码,如何改密码?
今天服务器突然进不去了,不知道是密码被改了,还是什么情况! 服务器版本:centos 7.0 网上查找了很多文档,有些办法不可行,如果是亲自试过绝对可行的方法: 1:重启服务器,如下界面,按键盘 &q ...
- 【Codebase】JQuery获取表单部分数据提交方法
JQuery使用ajax提交整个表单最简便的方法就是$('#form').serialize();但如果仅想保存表单中的部分数据,比如仅更新选中的条目,那么获取数据就比较麻烦了. 解决方法:新建一个表 ...
- 【shopex】真正可用的app开发机制
shopex的app开发机制详解 网上流传的shopex4.8.5的app开发教程,不仅说得不明不白,而且由于版本问题,照着做根本是做不成的. 知其然,亦要知其所以然. shopex提供了的一个干 ...
- JZOJ 5914. 盟主的忧虑
Description 江湖由 N 个门派(2≤N≤100,000,编号从 1 到 N)组成,这些门派之间有 N-1 条小道将他们连接起来,每条道路都以“尺”为单位去计量,武林盟主发现任何两个 ...
- PLC状态机编程第四篇-历史状态处理
今天我们接着上次的控制任务,加入历史状态,这个任务会比较复杂,象这样的任务我们倾向于自动生成PLC程序,自己写容易出错.但为了演示,我们可以尝试一下.言归正传,下面是我们的控制任务. 控制任务 这次的 ...
- you do not permission to access / no this server
最近在学习Linux下的httpd服务,自己写了一个虚拟主机的配置文件 重启之后,怎么访问都是出现以下的内容, do not permission to access / no this server ...
- 1014-34-首页15-计算原创微博的frame------计算cell的高度---计算 UILabel 的 CGSize 的方法
一.总体思路: 在控制器中,每次拿到数据模型(请求了数据.加载新微博)的时候,就调用 - (NSArray *)stausFramesWithStatuses:(NSArray *)statuses, ...
- VIM安装YCM插件
折腾了两天,终于好了 1.配置VIM (1)下载相关插件 sudo apt-get install git sudo apt-get install build-essential cmake sud ...
- 2,MongoDB之增删改查及pymongo的使用
本章我们来学习一下关于 MongoDB的增删改查 一.MongoDB操作 之 原生ORM,根本不存在SQL语句 创建数据库:这里和一般的关系型数据库一样,都要先建立一个自己的数据库空间 是的,Mong ...