您当前的位置: 首页 >  swift

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

发布时间:2018-08-01 10:59:07 ,浏览量:0

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

关注
打赏
1688896170
查看更多评论

暂无认证

  • 0浏览

    0关注

    107766博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.5303s