我需要在两个不同的数组中匹配项目(一个带有导入的项目,另一个带有与导入项目共享某些属性的本地项目),以同步两个完全不同的数据库。我需要使用几个标准进行匹配,以增加查找正确的本地项目的鲁棒性,并与导入项目匹配。我可以在同一循环中检查每个标准,但这太昂贵了,因为根据降序成功的可能性检查了标准。因此,在我的第一个实施中,我使用了一个名为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 Flow Control的博客中找不到任何确定的答案。
不,没有副作用,相反,它更有效。
这就像布尔表达中的短路评估。
但是您的代码是一个不好的例子,因为found
不能在功能之外使用。
这是一个更实用的示例,返回布尔值
func match() -> Bool
{
for localItem in localItems
{
if (self.property == localItem.property)
{
// update the local item here
return true
}
}
....
return false
}
如果您确定可以返回,因为循环后没有其他事情要做,那么使用返回