在swift中实现ruby数组中的的any方法

用过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开发支持的话,那真是爽爆了。(我要是没记错的话,以前好像真是有!)

猜你喜欢

转载自blog.csdn.net/mydo/article/details/81326931