2016-10-25 35 views
1

我使用雨燕3.0,并有在数组搜索的项目作为字符串类型的扩展验证码:获取较短版本的for循环?

extension String { 
    func equal(compareToArray : [String]) -> Bool { 
     for s in compareToArray { 
      if self == s { 
       return true 
      } 
     } 
     return false 
    } 
} 

它运行良好,但我的问题是,我可以做的更好(更短/更简单或更快)?

好了,另一个类似的例子:

func contains(compareToArray : [String]) -> Bool { 
    for s in compareToArray { 
     if self.contains(s) { 
      return true 
     } 
    } 
    return false 
} 

回答

6

更短,更简单,更快速

let compareToArray = ["foo", "bar", "baz"] 
compareToArray.contains("bar") 

编辑:

根据你的第二个例子

compareToArray!过滤器{$ 0.conta插件( “OO”)} .isEmpty

compareToArray.index(where: {$0.contains("oo")}) != nil 
+0

:-)是的,你说得对。我添加了另一个例子,不应该转身。 :-) – Peter71

+0

好的,即使结果已经为真,该过滤器也会获取所有数组成员。它更短,但更慢。我无法决定哪一个更好。 :-) 谢谢。 – Peter71

+0

你的第一个例子比OP更快吗?键入的速度更快,当然,但是'contains'在引擎盖下完全一样。即使'$ 0.contains(“oo”)'返回true,您的第二个示例也会不必要地遍历整个'compareToArray'。使用'compareToArray.contains {...}'会更好:) – Hamish

0

如果你想检查一个元素是否属于一个数组,在雨燕3.0,这是一个更好的办法:

使用:

array.index(of:element) - > Int?

例:

let myArray = ["a", "b", "c"] 
let needle = "b" 

if let pos = myArray.index(of: needle') { 
    print("\(needle) is in array at position : \(pos)" 
} else { 
    print("It's not in array") 
} 
+0

我正在寻找使用内部函数(如过滤器,地图等)的for-loop的一般优化... – Peter71