Block 实践
OC版
函数中无参无返回值
/*
作为函数参数类型的格式
返回值类型 (^)(形参列表)
*/
CZPerson.h
- - (void) test:(void (^)(void))block;
CZPerson.m
- - (void)test:(void (^)())block{
- NSLog(@"test");
- block();
- }
调用:
- - (void)test{
- CZPerson *person = [CZPerson new];
- [person test:^{
- NSLog(@"哈哈哈哈");
- }];
- }
打印结果
函数中有参有返回值
CZPerson.m
- - (int) average:(int (^)(int num1, int num2))sum{
- return sum(, ) /; //num1, num2是通过这个sum传到外面的,不是我们在这里用到num1和num2的值(如果这样使用sum(num1, num2), 会报错)。在这里将10赋值给这个形参blok块sum中的num1,20赋值给num2;
- }
感悟:average方法的参数不是num1和num2,而是sum这个块整体。(int num1, int num2)相对于 sum(10, 20)来说num1和num2是形参,将值传给了num1和num2.
调用:
- CZPerson *person = [CZPerson new];
- // 这里的num1和num2是从这个average方法中的参数block传来的,给这个block使用的
- int avar = [person average:^int(int num1, int num2)
- {
- return num1 + num2;
- }];
- NSLog(@"----->%d", avar);
打印结果:
获取局部变量的值
- /*
- 在block中可以访问局部变量的值
- 默认在block内部不能修改局部变量的值
- 如果修改局部变量的值,要再定义这个变量的时候,在前面加上__block
- */
- __block int num =; //表示block中的这个变量要与num保持一致,都是变量
- void (^test)(void) = ^{
- num = ; //如果不加block,这会报错。因为这个block不是变量了,因为它放入block后,num表示的是这个10的值
- NSLog(@"%d", num);
- };
- test();
- NSLog(@"--->%d",num);
打印结果:
Swift版
直接上代码
- var arr = [, , , , , ];
- // (_ num: Int, _ value: Int) -> Bool 闭包Closure参数类型
- func hasClosureMatch(arr: [Int], value: Int, cb:(_ num: Int, _ value: Int) -> Bool) -> Bool {
- for item in arr {
- // 只是调用cb 闭包closure里面的函数,不管如何实现
- // 类似oc 的blocks,c 的函数指针
- if cb(item, value) {
- return true
- }
- }
- return false
- }
调用
- // Closure, func closure(_ num: Int, _ value: Int) -> Bool, 在这里这个闭包相当于一个变量,里面保存了一段代码,当用到这个闭包时才会跳进闭包里面的代码
- var v1 = self.hasClosureMatch(arr: arr, value: ) { (num, value) -> Bool in
- return num >= value
- }
- print("v1 is \(v1)")
结果:
v1 is false
另一种参数简单模式
- let v2 = self.hasClosureMatch(arr: arr, value: ) {
- // 没有写类型(_ num: Int, _ value: Int) -> Bool
- // 这里$0 表示 num, $1表示 value,用到了shell编程
- return $ < $
- }
- print("v2 is \(v2)")
结果:
v2 is true
Block 实践的更多相关文章
- <CEPH中国-深圳站-技术交流会演讲PPT> YY云平台Ceph Block应用实践 & 我写的书 《CEPH实战》
YY云平台Ceph Block应用实践 http://s3.yyclouds.com/public/YY%E4%BA%91%E5%B9%B3%E5%8F%B0Ceph%E5%AE%9E%E8%B7%B ...
- [New learn]讲解Objective-c的block知识-实践
1.简介 在之前的文章[New learn]讲解Objective-c的block知识中介绍了block的相关知识.本章中我们将以一个实际例子来简单介绍一下block如何代替代理. 2.原有通过代理实 ...
- SunRay4(新蕾4) 定时自动关机方案, Linux后台自动任务crontab实践
目录: 需求和思路分析 具体实现步骤 理解Crontab Crontab具体参数详细说明 最近碰到一个想要实现定时自动关机的功能,关机的指令无非就是: shutdown -h time 调用openw ...
- ReactiveCocoa代码实践之-UI组件的RAC信号操作
上一节是自己对网络层的一些重构,本节是自己一些代码小实践做出的一些demo程序,基本涵盖大多数UI控件操作. 一.用UISlider实现调色板 假设我们现在做一个demo,上面有一个View用来展示颜 ...
- php+websocket搭建简易聊天室实践
1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短 ...
- MySQL · 答疑解惑 · MySQL 锁问题最佳实践
http://mysql.taobao.org/monthly/2016/03/10/ 前言 最近一段时间处理了较多锁的问题,包括锁等待导致业务连接堆积或超时,死锁导致业务失败等,这类问题对业务可能会 ...
- ReactJS实践(一)—— FrozenUI React化之Loading组件
在前面我们通过四篇文章入门了React的大部分主要API,现在则开始进入实践环节. 实践系列的开篇打算拿我司的FrozenUI来试验,将其部分UI组件进行React化,作为第一篇实践文章,将以较简单的 ...
- javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)
类似于幻灯片的切换效果,有时需要在网页中完成一些图片的自动切换效果,比如广告,宣传,产品介绍之类的,那么单纯的切就没意思了,需要在切换的时候通过一些效果使得切换生动些. 比较常用之一的就是窗帘切换了. ...
- ReactiveCocoa代码实践之-更多思考
三.ReactiveCocoa代码实践之-更多思考 1. RACObserve()宏形参写法的区别 之前写代码考虑过 RACObserve(self.timeLabel , text) 和 RACOb ...
随机推荐
- 【Python爬虫】PyQuery解析库
PyQuery解析库 阅读目录 初始化 基本CSS选择器 查找元素 遍历 获取信息 DOM操作 伪类选择器 PyQuery 是 Python 仿照 jQuery 的严格实现.语法与 jQuery 几乎 ...
- gpg签名用法
– 在CentOS 6上生成公钥/私钥对 [root@localhost ~]# gpg --gen-key gpg (GnuPG) ; Copyright (C) Free Software Fou ...
- Log4j Append属性指定是否追加内容
Log4j默认是不断的把日志内容追加到日志文件: 这里就有个属性 Append 默认就是true: 假如我们设置成false 就不追加了 直接覆盖前面的内容: 我们来测试下: log4j.rootLo ...
- WebSocket 的鉴权授权方案
引子 WebSocket 是个好东西,为我们提供了便捷且实时的通讯能力.然而,对于 WebSocket 客户端的鉴权,协议的 RFC 是这么说的: This protocol doesn’t pres ...
- VS 2017 安装测试
3月7日, VS 出了新的版本2017 安装效果如下: 不过官方说会改变VS 2015附件python 的方式,变成类似C++ 一样集成python语言包到VS中. 目前没有看见,大家如果有兴趣可以安 ...
- dataframe操作
1.去除重复项drop_duplication #去除重复项drop_duplication import pandas as pd df = pd.DataFrame({"col1&quo ...
- 转发(forward)和重定向(redirect)
转发和重定向 参考:http://www.2cto.com/kf/201107/97118.html 以前写的一个注册页面: package com.ifly.bbs.controller; impo ...
- IPFS私链搭建及常用操作命令
1. 共享密钥 同一个IPFS私链内的所有节点必须共享同一个密钥才能加入. 首先我们使用密钥创建工具,创建一个密钥. 下载地址:https://github.com/Kubuxu/go-ipfs-sw ...
- zabbix 配合钉钉群机器人(webhook) 报警
首先建钉钉群,添加一个自定义机器人拿到webhook zabbix添加一个报警媒介 搞一个shell脚本来启动Python脚本(直接用zabbix调Python脚本不行,不知道什么原因) vim di ...
- UML序列图的理解:
UML序列图的理解:UML序列图是指一个对象的方法在处理过程中调用其他对象的图:重点是要突出调用其他对象的序列: