Swift中由找不到removeAll(where:)方法引起的连锁反应(上)

Swift中由找不到removeAll(where:)方法引起的连锁反应(上),第1张

概述  核心代码    section.removeAll {baseRow in    if let habitRow = baseRow as? HabitRow{    let idxPath = habitRow.indexPath!    return willRemoveIdxPaths.contains(idxPath)    }    return false    以上代码片段的功能

  核心代码    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中由找不到removeAll(where:)方法引起的连锁反应(上)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1022370.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存