是否有任何副作用,可以退出返回而不是迅速中断的循环



我需要在两个不同的数组中匹配项目(一个带有导入的项目,另一个带有与导入项目共享某些属性的本地项目),以同步两个完全不同的数据库。我需要使用几个标准进行匹配,以增加查找正确的本地项目的鲁棒性,并与导入项目匹配。我可以在同一循环中检查每个标准,但这太昂贵了,因为根据降序成功的可能性检查了标准。因此,在我的第一个实施中,我使用了一个名为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
}

如果您确定可以返回,因为循环后没有其他事情要做,那么使用返回

没有副作用

最新更新