AJ分享,必须精品

一:场景

我们有个对象人,他有两个方法,一个是学习study,一个是跑步run,
这个人有个怪癖,跑完步之后必须学习,为了实现这个方法并且能调用方便,我们让跑步和学习都回返回自己这个对象作为下一次调用的快捷方式,代码如下:
调用:

int main(int argc, const char * argv[])
{
@autoreleasepool {
//初始化人
Person *p = [[Person alloc] init];
//调用
[[p study] run];
return 0;
}

人对象:


// Person.h
#import <Foundation/Foundation.h> @interface Person : NSObject
- (Person *)study;
- (Person *)run;
@end

// Person.m
#import "Person.h" @implementation Person
- (Person *)study
{
NSLog(@"study----"); return self;
} - (Person *)run
{
NSLog(@"run----");
return self;
} @end

运行结果

二:block链式结构实现

调用:

int main(int argc, const char * argv[])
{
@autoreleasepool {
Person *p = [[Person alloc] init]; p.study(@"xx宝典").run().study(@"xx剪发");
}
return 0;
}

人对象:

//Person.h
@interface Person : NSObject - (Person *(^)(NSString *name))study;
- (Person *(^)())run;
@end
//Person.m
@implementation Person - (Person *(^)(NSString *))study
{
return ^(NSString *name){
NSLog(@"study----%@", name);
return self;
};
} - (Person *(^)())run
{
return ^{
NSLog(@"run----");
return self;
};
}
@end

在这里面,我们

p.study(@”xx宝典”).run().study(@”xx剪发”);
调用study方法:p.study
执行block:p.study(@”xx宝典”)
结合person内部写的方法

- (Person *(^)(NSString *))study
{
return ^(NSString *name){
NSLog(@"study----%@", name);
return self;
};
}

明显可以看到,当执行p.study(@”xx宝典”)时候,内部是return一个返回值是person*类型(最后的return self)的block 这也就解释了为什么下一句可以继续连着用点来调用了。也就是说返回的是一段block,这段block里面又有返回值,返回值是person的对象self。
这里的参数有点晕,记住就好,用链式结构的block的巧妙用法,简单了解就好

执行结果

AJ学IOS 之BLOCK的妙用_利用block实现链式编程的更多相关文章

  1. iOS开发技巧系列---使用链式编程和Block来实现UIAlertView

    UIAlertView是iOS开发过程中最常用的控件之一,是提醒用户做出选择最主要的工具.在iOS8及后来的系统中,苹果更推荐使用UIAlertController来代替UIAlertView.所以本 ...

  2. iOS利用block实现链式编程方法(Objective-C链式编程)

    objc利用block实现链式编程方法 因为不好读.block和其他语言的匿名函数一样,很多程序员刚开始很难主动去用他. 本文描述block作为属性的实际使用,看懂block,并讲解如何利用block ...

  3. iOS:用Block写一个链式编程

    一.介绍 链式编程是一个比较新颖的编程方式,简单直观,用起来也比较舒服.目前比较有名的Mansory和BabyBlueTooth就是使用链式编程写的第三方框架. 二.写法 链式编程写法不同于传统方式, ...

  4. 实现iOS中的链式编程

    谈到链式编程,那Masonry几乎就是最经典的代表.如: make.top.equalTo(self.view).offset() 像这样top.equalTo(self.view).offset(6 ...

  5. iOS 开发之使用链式编程思想实现简单的计算器

    链式编程思想是将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性好.例如 a(1).b(2).c(3). 链式编程思想最为关键的是,方法的返回值是block,block必须返回对 ...

  6. iOS 链式编程探索(Masonry)

    看了几篇关于链式编程的文章,还是理解的不透彻,我想这可能是因为我自己对block掌握的不熟练. 我已经明白了,所以,和大家分享一下我的理解!如有问题,麻烦大家指出! 直接看代码吧!关键的注释都有. 我 ...

  7. ios的链式编程笔记

    1.Masonry的语法为啥能连续的使用点语法? >> 底层使用的是:用block当函数的返回参数  > 链式编程思想 2. 使用block当函数的返回参数 // 之前开发中比较习惯 ...

  8. 第四十一篇、Masonry利用Block实现链式编程

    一直都觉得使用Masonry的时候语法特别优雅,很早的时候就想尝试下怎么实现, 一直都没弄明白,直到最近看见一篇叫block实现链式编程的 1.方法的返回类型是代码块 >代码块的返回类型是该类的 ...

  9. (一一八)利用block实现链式编程

    有些时候需要不断地调用方法,如果使用传统方案,需要拿到对象多次调用,例如有一个Ball对象,实现了up.down.left.right四个方法,分别控制球的运动方向,如果要实现球向右再向下,需要这么写 ...

随机推荐

  1. JavaScript 模式》读书笔记(3)— 字面量和构造函数3

    这是字面量和构造函数的最后一篇内容,其中包括了JSON.正则表达式字面量,基本值类型包装器等知识点.也是十分重要的哦. 五.JSON JSON是指JavaScript对象表示以及数据传输格式.它是一种 ...

  2. payload分离免杀

    shellcode loader 借助第三方加载器,将shellcode加载到内存中来执行. https://github.com/clinicallyinane/shellcode_launcher ...

  3. 洛谷 P3935 Calculating 题解

    原题链接 一看我感觉是个什么很难的式子-- 结果读完了才发现本质太简单. 算法一 完全按照那个题目所说的,真的把质因数分解的结果保留. 最后乘. 时间复杂度:\(O(r \sqrt{r})\). 实际 ...

  4. laravel如何实现多用户体系登录

    laraveli添加一个或多个用户表,以admin为例. 部分文件内容可能需要根据实际情况修改 创建一个Admin模型 php artisan make:model Admin -m 编写admins ...

  5. 为什么你的程序配了classpath还是找不到类

    classpath简介 classpath是java程序时拥有的一个系统变量,这个变量可以通过如下方式获取 System.out.println(System.getProperty("ja ...

  6. 面试刷题22:CAS和AQS是什么?

    java并发包提供的同步工具和线程池,底层是基于什么原理来设计和实现的呢?这个非常重要. 我是李福春,我在准备面试,今天的题目是: CAS和AQS是什么? 答:CAS是一系列的操作集合,获取当前值进行 ...

  7. shell脚本基础知识以及变量

    一.基础知识 1.shell脚本的格式注意事项 第一行(一般必须写明):指定脚本使用的shell(若不写明也不影响脚本的执行,系统会自动以sh解析脚本)."#!/bin/bash" ...

  8. 服务器上安装.NET Framework 3.5 sp1

    操作系统是Windows Server 2008 R2 或 Windows Server 2012 或 Windows Server 2012 R2,可以直接进入“服务器管理器”添加“功能”.

  9. AttributeError: module 'tensorflow.python.keras.backend' has no attribute 'get_graph'处理办法

    原因:安装的tensorflow版本和keras版本不匹配,只需卸载keras,重新安装自己tensorflow对应的版本. Keras与tensorflow版本匹配查询网站  

  10. Java并发基础02. 传统线程技术中的定时器技术

    传统线程技术中有个定时器,定时器的类是Timer,我们使用定时器的目的就是给它安排任务,让它在指定的时间完成任务.所以先来看一下Timer类中的方法(主要看常用的TimerTask()方法): 前面两 ...