OC学习之道:关于Block的初级学习
- "code" class="OC">
- //
- // main.m
- // Copyright (c) 2015年 tongxing. All rights reserved.
- //
- #import
- #import "Student.h"
- typedef int(^BlockType)(int,int);
- int globalVariable = 200;
- int main(int argc, const charchar * argv[])
- {
- @autoreleasepool {
- //int (int a,int b)表示匿名函数的类型
- //int (^ )(int a,int b)表示Block的类型
- //myBlock实现的是匿名函数的实现体部分
- int (^ myBlock)(int a ,int b) =^int(int a ,int b){
- return a+b;
- };//这里需要加分号,因为这整个部分相当于一个赋值语句,大括号内容赋值给块变量myBlock
- //按照调用函数的方式调用块对象
- int value = myBlock(3,5);//通过myBlock实现两个整型数的求和,返回值为int
- NSLog(@"%d",value);
- //写⼀个 返回值为整型 参数为NSString(仅⼀一个参数)的block,实现将字符串转换为整型的功能.
- int (^strBlock)(NSString *str)=^int(NSString *str){
- int value =[str intValue];
- return value;
- };
- NSString *str = @"123";
- //使用block
- NSLog(@"%d",strBlock(str));
- //练习,定义三个block求商/差/积
- int (^cutBlock)(int ,int )=^int(int a,int b){
- return a-b;
- };
- int (^dealerBlock)(int ,int)= ^(int a,int b){
- return a%b;
- };
- int (^rideBlock)(int,int ) = ^(int a,int b){
- return a*b;
- };
- NSLog(@"%d",cutBlock(3,5));
- NSLog(@"%d", dealerBlock(3,5));
- NSLog(@"%d",rideBlock(3,5));
- //对于上面三个函数的类型都一样,所以可以引入typedef来在#import下面进行重定义
- #pragma mark----给相同block类型进行重命名
- BlockType myBlock1 = ^int(int a,int b){//对于^后面的int可以省略,但是系统默认的是int型,所以如果是其他类型一定要写上
- return a-b;
- };
- NSLog(@"%d",myBlock1(4,5));
- //.....
- #pragma mark----block与全局变量
- //定义一个全局变量globalVariable
- void (^block)(void) = ^(){//^(void)(),前面的返回值类型void可以省略,但是后面的括号语法上定义是不可以省略(),但是经过测试没有参数也可以省略
- globalVariable++;//如果是全局变量可以直接被访问和修改
- NSLog(@"%d",globalVariable);
- };
- block();
- #pragma mark----block与局部变量
- // int number =1;//局部变量需要加__block,否则会提示出错
- __block int number = 1;
- void (^block1)(void) = ^(){
- number++;//如果是局部变量不可以直接被访问和修改,必须在number前面加一个__block,这里需要打两个小_
- NSLog(@"%d",number);
- };
- block1();
- #pragma mark----block自动截取变量
- int val = 10;
- void (^blk)(void) = ^(){
- // printf("val=%d\n",val);
- NSLog(@"%d",val);
- };
- val = 2;
- blk();
- //上面这段代码,输出值是:val = 10.而不是2.block截获自动变量的瞬时值。因为block保存了自动变量的值,所以在执行block语法后,即使改写block中使用的自动变量的值也不会影响block执行时自动变量的值。
- #pragma mark----block与数组排序
- //关于数组的排序已经总结过,这里做一个比较
- //使用系统自带compare比较系统自带对象
- NSArray *strsArray =[NSArray arrayWithObjects:@"abc",@"cdf",@"ade",@"feg", nil nil];
- NSArray *newArray = [strsArray sortedArrayUsingSelector:@selector(compare:)];
- NSLog(@"%@",newArray);
- //使用block方式比较系统自带对象
- //该种方式是按block的语法按步骤来进行比较的,下面背注掉的是使用简便的方式,两者原理一样
- NSComparisonResult(^strBlock1)(id obj1,id obj2)=^NSComparisonResult(id obj1,id obj2){
- NSString *result1 = (NSString *)obj1;
- NSString *result2 = (NSString *)obj2;
- return [result1 compare:result2];
- };
- NSArray *resut3 = [strsArray sortedArrayUsingComparator:strBlock1];//strBlock1
- NSLog(@"%@--",resut3);
- // NSArray *sortArray = [strsArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {^NSComparisonResult(id obj1, id obj2)相当于上面的strBlock1
- // NSString *result1 = (NSString *)obj1;
- // NSString *result2 = (NSString *)obj2;
- // return [result1 compare:result2];
- // }];
- // NSLog(@"%@",sortArray);
- //对于系统自带的对象和类都可以用compare方法,但是自定义的类需要自己重写compare方法
- //使用自定义compare方法对数组中得对象按照年龄进行排序,(数组中的对象为自定义类型的对象)
- Student *stu1 = [Student studentWithName:@"刘亦菲" Age:26 Score:89.0];
- Student *stu2 = [Student studentWithName:@"张飞" Age:34 Score:78.0];
- Student *stu3 = [Student studentWithName:@"周冬雨" Age:22 Score:85.0];
- NSMutableArray *stusarray = [NSMutableArray arrayWithObjects:stu1,stu2,stu3 , nil nil];
- [stusarray sortUsingSelector:@selector(studentCompare:)];
- for (NSString * str in stusarray) {
- NSLog(@"%@",str );
- }
- //使用block方式对数组中得对象按照年龄进行排序,(数组中的对象为自定义类型的对象)
- [stusarray sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
- Student *stu1 = (Student *)obj1;//强制转换成自定义类型
- Student *stu2 = (Student *)obj2;
- return [stu1 studentCompare:stu2];
- }];
- for (NSString *stri in stusarray) {
- NSLog(@"%@",stri);
- }
- //使用自定义的block实现对数组中的对象进行排序,基本处理方式与上述的处理系统对象相似,只是如果不知道参数类型必须进行强制转换
- NSComparisonResult(^stuBlock)(id ob1,id ob2) =^ NSComparisonResult(id ob1,id ob2){
- Student *stud1 = (Student *)ob1;//强制转换
- Student *stud2 = (Student *)ob2;
- return [stud1 studentCompare:stud2];
- };
- [stusarray sortUsingComparator:stuBlock];//调用自定义块
- for (NSString *stri in stusarray) {
- NSLog(@"%@",stri);
- }
- }
- return 0;
- }
自定义的Student类的.h文件和.m文件如下:
.h文件
//
// Student.h
// Copyright (c) 2015年 tongxing. All rights reserved.
//
#import
@interface Student : NSObject
@property NSString *name;
@property int age;
@property float score;
//这里提前使用了OC中得属性
//关于属性的知识,后面将会给出相关学习,有兴趣的同学可以去博客园了解:http://www.cnblogs.com/wendingding/p/3706430.html
//{
// NSString *_name;
// int _age;
// float _score;
//}
//-(void)setName:(NSString *)name;
//-(void)setAge:(int)age;
//-(void)setScore:(float)score;
//-(float)score;
//-(NSString *)name;
//-(int)age;
-(id)initWithName:(NSString *)name Age:(int)age Score:(float)score;
+(id)studentWithName:(NSString *)name Age:(int)age Score:(float)score;
//自定义比较方法
-(NSComparisonResult)studentCompare:(Student *)student;
@end
- .m文件
- //
- // Student.m
- // lesson6
- //
- // Created by lanou3g on 15-4-7.
- // Copyright (c) 2015年 tongxing. All rights reserved.
- //
- #import "Student.h"
- @implementation Student
- //@synthesize _name ;
- //@synthesize _age;
- //@synthesize _score ;
- //自从xcode 4.4后,@property就独揽了@property和@synthesize的功能。
- //-(void)setName:(NSString *)name{
- // _name = name;
- //}
- //-(void)setAge:(int)age{
- // _age = age;
- //}
- //-(NSString *)name{
- // return _name;
- //}
- //-(int)age{
- // return _age;
- //}
- //-(void)setScore:(float)score{
- // _score = score;
- //}
- //-(float)score{
- // return _score;
- //}
- -(id)initWithName:(NSString *)name Age:(int)age Score:(float)score{
- if (self = [super init]) {
- _name = name;
- _age = age;
- _score = score;
- }
- return self;
- }
- +(id)studentWithName:(NSString *)name Age:(int)age Score:(float)score{
- Student *student = [[Student alloc]initWithName:name Age:age Score:score];
- return student;
- }
- -(NSComparisonResult)studentCompare:(Student *)student{
- NSComparisonResult result1 = [[NSNumber numberWithInt:self.age] compare:[NSNumber numberWithInt:student.age]];
- return result1;
- }
- -(NSString *)description{
- return [NSString stringWithFormat:@"%@,%d",_name,_age];
- }
- @end
- 欢迎分享本文,转载请注明出处!
OC学习之道:关于Block的初级学习的更多相关文章
- Linux快速入门打开你的学习之道
Linux快速入门打开你的学习之道 相信看到这篇文章的你一定是想要学习Linux,或者已经在学习Linux的人了,那我们就可以一起探讨一下,学习Linux如何快速入门呢? 首先,希望大家弄清楚自己为什 ...
- webpack 4.x 初级学习记录
首先声明下,本人不擅长文字表达,文采不行,所以文章中文字较少,请看代码,初级学习,不足之处请多多指教 GitHub链接 看云kancloud [TOC] webpack 4.x 安装 首先需要在全局中 ...
- linux初级学习笔记十:linux grep及正则表达式!(视频序号:04_4)
本节学习的命令:grep 本节学习的技能: grep对文本的匹配 正则表达式的使用 知识点十:grep及正则表达式(4_4) grep,egrep,fgrep: grep: 根据模式搜索文本,并将符合 ...
- 强化学习读书笔记 - 06~07 - 时序差分学习(Temporal-Difference Learning)
强化学习读书笔记 - 06~07 - 时序差分学习(Temporal-Difference Learning) 学习笔记: Reinforcement Learning: An Introductio ...
- Linux学习路线全解,Linux操作系统学习路线
大家都知道,在现在这个信息化飞速发展的时代,IT技术火速发展,信息的重要性,可想而知.现在,在北京当一个高级运维工程师,年薪百万已经不是梦想.当然我也想,谁不想挣大钱,开好车,住好房.下面说说自己的一 ...
- 【转载】 “强化学习之父”萨顿:预测学习马上要火,AI将帮我们理解人类意识
原文地址: https://yq.aliyun.com/articles/400366 本文来自AI新媒体量子位(QbitAI) ------------------------------- ...
- Hadoop源码学习笔记(3) ——初览DataNode及学习线程
Hadoop源码学习笔记(3) ——初览DataNode及学习线程 进入了main函数,我们走出了第一步,接下来看看再怎么走: public class DataNode extends Config ...
- Python深度学习读书笔记-1.什么是深度学习
人工智能 什么是人工智能.机器学习与深度学习(见图1-1)?这三者之间有什么关系?
- Elasticsearch7.X 入门学习第三课笔记----search api学习(URI Search)
原文:Elasticsearch7.X 入门学习第三课笔记----search api学习(URI Search) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出 ...
随机推荐
- 阿里云linux下web服务器配置
markdown截图不方便,本教程不用markdown编写 首先参考文章 https://www.jianshu.com/p/2604e53a7f6a?from=singlemessage 安装完后无 ...
- PyCharm 2018.1破解过程
一.下载 首先从官网下载 官网,如果开了酸酸乳的话无法下载,官网会自动断开连接.所以下载时请关闭酸酸乳 二.安装 选择安装路径 选择64位,创建关联.py文件 安装完后运行Pycharm 选择不导入开 ...
- Node.js HTTPS
稳定性: 3 - 稳定 HTTPS 是基于 TLS/SSL 的 HTTP 协议.在 Node 里作为单独的模块来实现. 类: https.Server 这是 tls.Server 的子类,并且和 ht ...
- Python3 JSON 数据解析
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. Python3 中可以使用 json 模块来对 JSON 数据进 ...
- 王家林人工智能AI课程大纲和电子书 - 老师微信13928463918
**3980元团购原价19800元的AI课程,团购请加王家林老师微信13928463918. 基于王家林老师独创的人工智能"项目情景投射"学习法,任何IT人员皆可在无需数学和Pyt ...
- 浅析深度学习mini_batch的BP反传算法
在深度学习中,如果我们已经定义了网络,输入,以及输出,那么接下来就是损失函数,优化策略,以及一般由框架完成的BP反传.这篇博文我们主要探讨一下深度的BP反传算法(以梯度下降为例),尤其是mini_ba ...
- Struts 2 之资源国际化
首先在struts.properties文件中加入以下内容: struts.custom.i18n.resources=messageResource 或在struts.xml中加入 <con ...
- Dynamics CRM2016 新功能之从CRM APP中导出数据至EXCEL
新版的CRM对移动端做了很多的改进,这归咎于微软对APP端的越来越重视.自己装了个IOS版的APP,体验了下基本的功能,比原来好用很多很顺滑,这里要介绍的是一个新的数据导出功能. 咱们进入case列表 ...
- windows 7、8分区
如果你的机器一开始安装的是windows7或者8, 一般分配的分区都是主分区.如果你想再搭配个linux操作系统,搞个双系统啥的,可能总是失败.我有血的教训啊. 从源头上可以解决分区问题,就是可以在安 ...
- ubuntu16.04主题美化和软件推荐
前几天把ubuntu从15.10更新到了16.10,在网上看到有很多直接更新出问题的,正好赶上换SSD,于是采用全新安装,之前用ubuntu的时候装软件最让人头疼了,这回又得头疼一次了!! 索性把他记 ...