当前位置: 首页 > news >正文

GCD1:构建Block Objects

问题:

希望能够编写自己的 Block Objects 或与 iOS SDK 类使用 Block Objects。 
  讨论:
1.Block Objects 的对象可以内联或编码为独立的代码块。我们从后一种开始:
假设你在 Objective-C 中有一个方法,既能接受 NSInteger 类的 2 个整数值,又能通过两个相减返回两 者的差值作为 NSInteger: 

 

- (NSInteger) subtract:(NSInteger)paramValue from:(NSInteger)paramFrom{

return paramFrom - paramValue;

}

C函数:

NSInteger subtract(NSInteger paramValue, NSInteger paramFrom){

 return paramFrom - paramValue;

}

现在看看作为 Block Object 我们如何编码同样的功能: 

NSInteger(^subtract)(NSInteger,NSInteger) = 
^(NSInteger paramValue, NSInteger paramFrom){
    return  paramFrom - paramValue;      
}

再看一个例子:

C:

NSString* intToString (NSUInteger paramInteger){ return [NSString stringWithFormat:@"%lu", (unsigned long)paramInteger];
}

Block Object:

NSString* (^intToString)(NSUInteger) = ^(NSUInteger paramInteger){
  
    NSString *result = [NSString stringWithFormat:@"%lu",(unsigned long)paramInteger];
    return result;  

}

从上面可以看到独立Block Object最简单的形式为

void (^simpleBlock)(void) = ^{
   /**/ 
};

总结其表达式为

  返回值类型 (^函数名)(参数类型,参数类型...) = ^(参数类型+参数名,参数类型+参数名...){

 

}

 2. Block Objets可以以完全相同的方式调用C函数,如果他们有任何参数,你可以像C函数那样传递参数;
    任何返回值可以精确检索,就像检索 C 函数的返回值一样。例子: 

 

//独立的Block Objects 代码
NSString* (^intToString)(NSUInteger) = ^(NSUInteger paramInteger){   NSString *result = [NSString stringWithFormat:@"%lu",(unsigned long)paramInteger];   return result; }; - (void) callIntToString{   NSString *string = intToString(10); //能够像函数一样调用
  NSLog(@"string = %@", string); }

上面代码中,callIntToString方法中通过给intToString block传入一个参数10,并将 这个 block 的返回值放在一个 string 局部变量中.

 3.

现在我们需要一个 Objective-C 方法:这个方法接受 一个无符号的整数参数和一个 Block Object 作为参数。 
无符号的整数参数很简单,但是我们如何才能调用这个必须接受一个和 intToString Block Object 相同类型的 Block Object 方法。首先我们 typedef 这个intToStringBlock Object 的签名, 这个签名会告诉编译器我们的 Block Object 会接受什么参数: 

 

#import "AppDelegate.h"
typedef NSString* (^IntToStringConverter)(NSUInteger paramInteger);
//这个 typedef 告诉编译器 Block Objects 接受一个整数参数并且返回一个被 IntToString Converter 命名的标示符来展现的字符串。
现在我们继续来写一个 Objective-C 方法,它接受 一个整数和 IntToStringConverter 类型的 Block Object: 
- (NSString *)convertIntToString:(NSUInteger)paramInteger usingBlockObject:(IntToStringConverter)paramBlockObject{
    return paramBlockObject(paramInteger);
}

调用上面的方法:

NSString *result = [self convertIntToString:123 usingBlockObject:^NSString *(NSUInteger paramInteger) {
        NSString *result = [NSString stringWithFormat:@"%lu",(unsigned long)paramInteger];
        return result;
    }];

4.

 


 

转载于:https://www.cnblogs.com/safiri/p/4056438.html

相关文章:

  • SQL 难点解决:记录的引用
  • 百度PaddlePaddle再获新技能 智能推荐、对话系统、控制领域都能搞定!
  • SSL工作原理
  • Prometheus+Grafana+kafka_exporter搭建监控系统监控kafka
  • 07.Android之多媒体问题
  • 一款链接自动说明脚本
  • JS生成指定范围内的随机数
  • Windows UDP socket recvfrom返回10054错误的解决办法
  • 关于安排
  • C#委托
  • 力扣(LeetCode)965
  • 快速上手git
  • Android开发最佳学习路线图
  • 相对友好的 AVL Tree 教程
  • oracle中sql优化读书笔记1-优化器
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • ECS应用管理最佳实践
  • EOS是什么
  • es6要点
  • ES6之路之模块详解
  • gf框架之分页模块(五) - 自定义分页
  • HTTP请求重发
  • Java,console输出实时的转向GUI textbox
  • Java面向对象及其三大特征
  • 成为一名优秀的Developer的书单
  • 工程优化暨babel升级小记
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 关于springcloud Gateway中的限流
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 小程序01:wepy框架整合iview webapp UI
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 用quicker-worker.js轻松跑一个大数据遍历
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (12)Hive调优——count distinct去重优化
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (Matlab)使用竞争神经网络实现数据聚类
  • (Python第六天)文件处理
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (力扣)1314.矩阵区域和
  • (全注解开发)学习Spring-MVC的第三天
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (十一)c52学习之旅-动态数码管
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .form文件_一篇文章学会文件上传
  • .gitignore文件_Git:.gitignore
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET 的程序集加载上下文
  • .NET中的Exception处理(C#)
  • [Android]通过PhoneLookup读取所有电话号码
  • [C#] 我的log4net使用手册
  • [C/C++]数据结构 深入挖掘环形链表问题