在Swift中退出循环而不是中断是否有任何副作用?

时间:2016-12-01 12:46:12

标签: swift

我需要匹配两个不同数组中的项目(一个具有导入项目,另一个具有与导入项目共享某些属性的本地项目),以同步两个完全不同的数据库。我需要使用几个条件来进行匹配,以提高找到正确的本地项目的稳健性,并将其与导入的项目进行匹配。我可以在同一个循环中检查每个标准,但这太贵了,因为标准是按降序成功的可能性来检查的。因此,在我的第一个实现中,我使用了一个名为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流控制的博客中找不到任何确定的答案。

2 个答案:

答案 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
}