文档章节

swift没有了BlocksKit怎么办?

 谁知相恋最长情
发布于 2016/05/19 17:13
字数 807
阅读 25
收藏 0

阿里云携手百名商业领袖、技术大咖,带您一探行进中的数字新基建!>>>

 

在OC时代,我经常使用BlocksKit,觉得使用起来很方便.在RAC引入之前,blockskit让代码优雅了许多。然而swift发布后,因为swift是门强类型语言,不再推荐使用runtime相关的方法。在swift中,如果想使用runtime的有些特性需要特别的声明比如@objc这样。由此,blockskit并没有swift版本。然而,即使去掉了runtime的一些东西,blockskit也有一些扩展的方法很实用。
所以,我就综合自己的知识和网上的开源代码,自己写了一个方法:ClosuresKit
主要有以下3个部分的扩展

Foundation

集合类型增加的api

  • cs_match
    根据传入的闭包找出匹配的一条数据,filter返回的是一个集合,match只返回一条数据,这是区别。示例如下:

     

    1

    2

    3

    4

    5

    6

    7

    8

      let testSequence = [2,5,6,9]

     

      func testMatch() {

          let result = testSequence.cs_match { (value) -> Bool in

              return value == 5

          }

          assert(result==5,"match failed")

      }

  • cs_any
    参数和前面一样,返回的是布尔值,通过传入的闭包判断是否集合中有数据符合这个闭包。
  • cs_all
    参数和前面一样,返回的是布尔值,通过传入的闭包判断是否集合中所有数据符合这个闭包。
  • cs_none
    参数和前面一样,返回的是布尔值,通过传入的闭包判断是否集合中没有任何一条数据符合这个闭包。

NSObject可以方便的关联对象

封装了NSObject的objc_setAssociatedObject的方法。
几个api的区别也就是关联的策略不同,比如reatian、copy、weak等。

 

1

2

3

4

5

6

7

class AssocaitedObjectTests: XCTestCase {

    static var identifier = "identifier"

 

    func testCopyAssociateValue(){

        let test:NSMutableString="first"

        let view = UIView()

        view.cs_associateCopyOfValue(test, key:

这是单元测试中写的一个关联对象策略用copy的示例代码。

通知

可以通过cs_addNotificationObserverForName方便的添加对某个通知的处理:

 

1

2

3

4

5

6

7

func testObserverNotification() {

        let notificationName = "Test"

        cs_addNotificationObserverForName(name: "Test", object: nil) { (notification) in

            assert(notification.userInfo!["value"] as! String == "param",#function)

        }

        NSNotificationCenter.defaultCenter().postNotificationName(notificationName, object: self,userInfo:["value":"param"])

    }

 

NSTimer

可以在添加timer时传入闭包直接处理回调。示例代码:

 

1

2

3

4

5

6

7

8

9

10

    var count=0

    var timer:NSTimer?

 

    func testTimerWithtimeInterval() {

        timer = NSTimer.cs_scheduledTimerWithTimeInterval(1, repeats: false, userInfo: ["key":"value"]) {[unowned self] (timer) in

            assert(timer.userInfo!["key"]=="value", #function)

            print("times:(self.count)")

        }

        timer!.fire()

    }

 

UIKIt

给UIControl加了一个方便处理UIControlEvents的方法cs_addEventHandlerForEvents,示例如下:

 

1

2

3

   btn.cs_addEventHandlerForEvents(.TouchUpInside) { (sender) in

            print("TouchUpInside")

        }

 

UIGesture

可以给UIView方便的直接添加手势,支持链式编程,可以在添加手势时那个闭包里配置,连续处理几种不同的状态:

 

1

2

3

4

5

     label.cs_addPanGesture { (gestureRecognizer) in

            gestureRecognizer.maximumNumberOfTouches=2

        }.whenBegan { (gestureRecognizer) in

            print("began")

        }

如果不用配置,配置的闭包可以直接为空:

 

1

2

3

       label.cs_addPanGesture().whenChanged { (gestureRecognizer) in

            print("changed")

        }

也可以同时给几个状态添加同一个处理闭包:

 

1

2

3

lbState.nc_addPanGesture().whenStatesHappend([.Ended,.Changed]) { (gestureRecognizer) -> Void in

 

        }

还给tap和swipe添加了两个快捷的处理方法:

 

1

2

3

4

5

6

7

    label.cs_whenTapped { (tapGestureRecognizer) in

            print("tapped")

        }

 

     view.cs_whenSwipedInDirection(.Down) { (gestureRecognizer) in

            print("down")

        }

目前想到的api就这些,如果有需要添加的可以直接提到issue里,我会及时处理的,也欢迎直接提pull request。

© 著作权归作者所有

粉丝 0
博文 18
码字总数 9286
作品 0
程序员
私信 提问
加载中

评论(0)

关于Xcode中的文档偏好设置

对于一门新的技术和语言,我们在整个学习和使用过程中,获取相关信息最主要和最权威的来源便是其官方放出的文档。因为这是第一手的学习资料,文档结构,内容组织方式,术语和规范都是基于如何...

big军
2013/06/20
3.8K
0
【逐渐提高】ios 代码库 集合类

系统基础库 Category/Util sstoolkit 一套Category类型的库,附带很多自定义控件 功能不错~ BlocksKit 将Block风格带入UIKit和Founcation cocoa-helpers 一些Cocoa的扩展 2年前的工程 Coconu...

创意总监
2014/08/30
273
1
超全整理!常用的iOS第三方资源

一:第三方插件 1:基于响应式编程思想的oc 地址:https://github.com/ReactiveCocoa/ReactiveCocoa 2:hud提示框 地址:https://github.com/jdg/MBProgressHUD 3:XML/HTML解析 地址:https...

Sukijiang
2016/01/22
2.1K
0
iphone开发资源汇总

iphone开发资源汇总 如何用Facebook graphic api上传视频: http://developers.facebook.com/blog/post/532/ Keychain保存数据封装: https://github.com/carlbrown/PDKeychainBindingsContr......

长平狐
2012/10/25
284
0
iphone开发资源汇总

学习过程当中查找到的资料,做一个记录,以便更多朋友查看。 开发的过程有时候是简单的,因为我们可以站在巨人的肩上,跳得更高,走得更远。 如何用Facebook graphic api上传视频: http://d...

长平狐
2012/08/13
497
0

没有更多内容

加载失败,请刷新页面

加载更多

.NET中小数,浮点数和双精度之间的区别? - Difference between decimal, float and double in .NET?

问题: What is the difference between decimal , float and double in .NET? .NET中的decimal , float和double float什么区别? When would someone use one of these? 有人什么时候会使用......

fyin1314
今天
22
0
如何找出Windows上正在侦听端口的进程? - How can you find out which process is listening on a port on Windows?

问题: 如何找出Windows上正在侦听端口的进程? 解决方案: 参考一: https://stackoom.com/question/CXO/如何找出Windows上正在侦听端口的进程 参考二: https://oldbug.net/q/CXO/How-can...

技术盛宴
今天
10
0
OSChina 周三乱弹 —— 一家动物都快饿成标本了~

@黑觉非常君 :前天晚上9点开始睡觉,睡到昨天上午8点起床,昨天下午2点又睡,睡到下午7点多,晚上10点又困了,又睡,睡到今天上午8点,中途没醒过,怎么这么能睡,是不是快挂了。 能睡不是好...

小小编辑
今天
15
0
神剧推荐全剧最污片段精剪

神剧推荐,全剧最污片段精剪 豆瓣评分最高,脑洞最大,脑回路最曲折,恶搞无数经典,没有一条差评的神剧 整个系列完整版 到这里观看

a57571735
今天
22
0
pingan.

职位诱惑:金融,技术研发,技术攻关,大舞台大作为职位描述:职位诱惑:立志打造一支国内一流实盘量化交易框架开发团队职位描述:职位描述:负责实盘低时延量化交易框架及附属行...

MtrS
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部