数组 – 从对象数组中删除匹配的项目?
发布时间:2020-12-14 02:29:03 所属栏目:百科 来源:网络整理
导读:我有一个这样的对象数组: var myArr = [ MyObject(name: "Abc",description: "Lorem ipsum 1."),MyObject(name: "Def",description: "Lorem ipsum 2."),MyObject(name: "Xyz",description: "Lorem ipsum 3.")] 我知道我可以找到匹配的项目,如下所示: var t
我有一个这样的对象数组:
var myArr = [ MyObject(name: "Abc",description: "Lorem ipsum 1."),MyObject(name: "Def",description: "Lorem ipsum 2."),MyObject(name: "Xyz",description: "Lorem ipsum 3.") ] 我知道我可以找到匹配的项目,如下所示: var temp = myArr.filter { $0.name == "Def" }.first 但是现在如何从原来的myArr中删除它?我希望filter.first能以某种方式返回一个索引,所以我可以使用removeAtIndex.或者更好的是,我想做这样的事情: myArr.removeAll { $0.name == "Def" } // Pseudo 有任何想法吗?
你不了解的是Array是一个结构,因此是一个值类型.它不能像类实例一样进行变异.因此,即使扩展Array以编写变异的removeIf方法,您也将始终在幕后创建一个新数组.
因此,使用过滤器和闭包条件的逻辑否定因素没有缺点或缺乏一般性: myArr = myArr.filter { $0.name != "Def" } 例如,您可以像这样编写removeIf: extension Array { mutating func removeIf(closure:(T -> Bool)) { for (var ix = self.count - 1; ix >= 0; ix--) { if closure(self[ix]) { self.removeAtIndex(ix) } } } } 然后你可以像这样使用它: myArr.removeIf {$0.name == "Def"} 但事实上,这对你的时间来说是一个很大的浪费.你在这里没有做过滤器还没有做的事情.从myArr.removeIf语法中可能看出你正在改变myArr,但你不是;你用另一个数组替换它.实际上,在该循环中每次调用removeAtIndex都会创建另一个数组!所以你不妨使用过滤器并且开心. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |