【发布时间】:2019-08-11 08:19:07
【问题描述】:
斯威夫特 4.2
我有多个函数可以替换数组中的对象或结构(如果存在),如果不存在,则添加它。
func updateFruit(_ fruit: Fruit)
{
if let idx = fruitArray.firstIndex(where: { $0.id == fruit.id })
{
fruitArray[idx] = fruit
}
else
{
fruitArray.append(fruit)
}
}
显然我可以把它变成 Array 的扩展:
extension Array
{
mutating func replaceOrAppend(_ item: Element, whereFirstIndex predicate: (Element) -> Bool)
{
if let idx = self.firstIndex(where: predicate)
{
self[idx] = item
}
else
{
append(item)
}
}
}
但是,有没有更简单、更容易的表达方式?最好使用闭包或内置函数。
注意:当前的实现不允许使用集合。
【问题讨论】:
-
您的代码简单易行:)
-
仅供参考 - 由于您实际上是在寻找更多工作代码的代码审查,您可能希望查看Code Review 站点。如果您最终确实在那里发布了您的问题,请删除此问题。
-
你可以让你的生活“更轻松”,让你的
Fruit符合Equatable。这样做你不需要谓词。如果您想使用Set,只需使其符合Hashable。 -
@LeoDabus 我喜欢那个解决方案。
-
当您说您拥有“多个功能”时,其他功能是什么样的?我怀疑您正在沿错误的轴使此代码通用。他们都有
$0.id == newthing.id之类的东西,还是有其他谓词?是所有谓词$0.<prop> == newthing.<prop>(即使不只是id)?还是这些谓词更复杂?通用代码必须始终从它的调用方式开始,否则你会走错路。