用过ruby的童鞋都知道,其数组包含一个any?方法(后面的问号不是手误,ruby允许方法名后面带特殊字符,其中就包括问号):
2.2.6 :001 > a = [1,2,3,11,5]
=> [1, 2, 3, 11, 5]
2.2.6 :002 > a.any?
=> true
2.2.6 :003 > a.any? {|x| x == 11}
=> true
2.2.6 :004 > a.any? {|x| x == 112}
=> false
any方法有个好处就是只要满足条件就退出,不会再傻傻的全部遍历一遍。
那么如何在swift中使用any方法呢?我们来尝试一下:
extension Array{
public func any(_ transform: (Element) throws -> Bool) rethrows -> Bool{
var isAny = false
try self.forEach {element in
if try transform(element) == true{
isAny = true
return
}
}
return isAny
}
}
但是这个信手拈来的实现有个问题,就是就算符合条件的项目在第一个位置,它还是会遍历所有!
这是由于闭包中的return语句只是退出闭包,但是forEach方法还会遍历下去啊!
所以我们不用forEach而是用for in:
public func any(_ transform: (Element) throws -> Bool) rethrows -> Bool{
var isAny = false
for element in self{
if try transform(element) == true{
isAny = true
break //return true 也是可以的!!!
}
}
return isAny
}
这样就OK了!这样调用:
let ary = [1,2,4,7,11,9,20]
let isAny = ary.any {$0 == 11}
和ruby还真是差不多,所以swift的语法,特别是闭包这块的语法应该是借鉴了ruby。
不过上面只是抛砖引玉,其实swift中早就有了any方法,只是不叫any,而是contains,所以我们不用自己实现any了,这样使用:
let isAny = ary.contains {$0 == 11}
print(isAny)
其实在我心目中ruby一直是表现力最强的语言(意味着最简洁),用的最爽的语言!如果apple官方在Xcode中添加ruby开发支持的话,那真是爽爆了。(我要是没记错的话,以前好像真是有!)