文档章节

swift没有了BlocksKit怎么办?

 谁知相恋最长情
发布于 2016/05/19 17:13
字数 807
阅读 9
收藏 0
点赞 2
评论 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
博文 17
码字总数 9286
作品 0
程序员
BlocksKit初见:一个支持将delegate转换成block的Cocoa库

简介 项目主页: https://github.com/zwaldowski/BlocksKit BlocksKit 是一个开源的框架,对 Cocoa 进行了扩展,将许多需要通过 delegate 调用的方法转换成了 block。在很多情况下,blocks 比...

ios122 ⋅ 2015/12/17 ⋅ 0

Objective-C Blocks 工具包--BlocksKit

BlocksKit是一个开源的与Cocoa紧密集合的基础性框架,BlocksKit并没有创建新的宏,函数,方法和类,只是对Cocoa类的一个扩展,是一个blocks的大集合。BlocksKit给一些类带来了更好的block支持...

匿名 ⋅ 2016/06/13 ⋅ 0

Github上的热门iOS开源项目:AFNetworking、MagicalRecord、BlocksKit以及XVim

1. AFNetworking AFNetworking是一个非常受欢迎的轻量级的iOS、Mac OS X网络通信类库。它建立在NSURLConnection、NSOperation以及其技术的基础上,有着精心设计的模块结构和功能丰富的API,让...

Im刘亚芳 ⋅ 2015/02/09 ⋅ 0

理解Swift中Optional类型-有和无的哲学

原文连接:http://blog.barat.cc/ios/understanding-swift-optional/ nil的遗憾 当某个变量或表达式没有任何内容时,在Objective-C中可以使用nil来表示。nil在Objective-C中是一个「野孩子」...

hejunbinlan ⋅ 2015/11/20 ⋅ 0

Swift for Windows怎么在Win7系统环境下操作?学习?

各位大神: Swift for Windows怎么在Win7系统环境下操作?本人主要是想学习一下swift,可是限于条件,只有win7电脑系统。怎么办,想学习的话,有方法吗?需要下载编程环境吧?我试了一下,没...

左宝锋 ⋅ 2016/07/06 ⋅ 0

学习笔记整理

写iOS 程序的时候往往需要很多第三方框架的支持,可以大大减少工作量,讲重点放在软件本身的逻辑实现上。 GitHub 里面有大量优秀的第三方框架,而且 License 对商业很友好。一下摘录一下几乎...

我是IT码农 ⋅ 2016/03/29 ⋅ 0

理解Swift中Optional类型-有和无的哲学

原文连接:http://blog.barat.cc/ios/understanding-swift-optional/ nil的遗憾 当某个变量或表达式没有任何内容时,在Objective-C中可以使用来表示。在Objective-C中是一个「野孩子」,voi...

巴拉迪维 ⋅ 2015/11/19 ⋅ 9

从现在,开始swift

导语 苹果在2014的WWDC中推出了Swift 这一全新的编程语言,一时之间成为各大网站的头条和所有程序员的讨论热点,与可读性较差的Objective-C相比,这门融合了多种编程语言优点的语言得到了各大...

芳仔小脚丫 ⋅ 2014/10/15 ⋅ 4

是时候正式进入 Swift开发了

Swift从14年发布到现在已经迎来了3.0的版本, 不得不说作为苹果公司推出的新语言, swift的未来是毋庸置疑的. 一种新的编程语言, 在快速发展的前期,变化是很大的, 这个勉强可以作为我们之前暂不...

Sunxb ⋅ 2016/11/02 ⋅ 0

Alert 简化使用--XJAlertManager

XJAlertManager 是簡化 iOS 原生 Alert, ActionSheet 的使用方法,將 iOS7、iOS8 收納在一起,讓您使用起來更加方便。 安装 安裝 pod 'BlocksKit' 使用示例 //Alert XJAlertManager *alert ...

hendrix ⋅ 2014/11/21 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

vbs 取文件大小 字节

dim namedim fs, s'name = Inputbox("姓名")'msgbox(name)set fs = wscript.createobject("scripting.filesystemobject") 'fs为FSO实例if (fs.folderexists("c:\temp"))......

vga ⋅ 7分钟前 ⋅ 0

高并发之Nginx的限流

首先Nginx的版本号有要求,最低为1.11.5 如果低于这个版本,在Nginx的配置中 upstream web_app { server 到达Ip1:端口 max_conns=10; server 到达Ip2:端口 max_conns=10; } server { listen ...

算法之名 ⋅ 今天 ⋅ 0

Spring | IOC AOP 注解 简单使用

写在前面的话 很久没更新笔记了,有人会抱怨:小冯啊,你是不是在偷懒啊,没有学习了。老哥,真的冤枉:我觉得我自己很菜,还在努力学习呢,正在学习Vue.js做管理系统呢。即便这样,我还是不...

Wenyi_Feng ⋅ 今天 ⋅ 0

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 今天 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 今天 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 今天 ⋅ 0

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部