我需要匹配两个不同数组中的项目(一个具有导入项目,另一个具有与导入项目共享某些属性的本地项目),以同步两个完全不同的数据库。我需要使用几个条件来进行匹配,以提高找到正确的本地项目的稳健性,并将其与导入的项目进行匹配。我可以在同一个循环中检查每个标准,但这太贵了,因为标准是按降序成功的可能性来检查的。因此,在我的第一个实现中,我使用了一个名为found
的布尔标志来标记应该忽略其他条件的检查。
使用伪代码:
// calling code for the matching
for item in importedItems {
item.match() }
在导入的项目类中:
match()
{
var found = false
for localItem in localItems
{
if (self.property == localItem.property)
{
// update the local item here
found = true
break
}
}
// match with less likely 2nd property
if (!found)
{
for localItem in localItems
{
if (self.property2 == localItem.property2)
{
// update the local item here
found = true
break
}
}
}
if !found {...}
模式再重复两次,标准更不可能。
在查看此代码后,很明显可以通过在匹配时返回而不是中断来优化此代码。
所以,我的问题是“在Swift中使用return
代替break
,是否有任何早期离开循环的副作用?”我在SO或Swift文档或讨论Swift流控制的博客中找不到任何确定的答案。
答案 0 :(得分:1)
如果您确定可以返回,因为循环后没有其他任何事情要做,那么使用返回没有任何副作用
答案 1 :(得分:1)
不,没有副作用,恰恰相反,效率更高。
它与布尔表达式中的Short-circuit evaluation类似。
但是你的代码是个坏例子,因为found
不能在函数外部使用。
这是一个更实用的示例,返回一个布尔值
func match() -> Bool
{
for localItem in localItems
{
if (self.property == localItem.property)
{
// update the local item here
return true
}
}
....
return false
}