pragma mark Block基本概念
pragma mark 概念
/**
1. 什么是Block
Block 是iOS中的一种比较特殊的数据类型
Block 是苹果官方特别推荐使用的数据类型,应该场景比较广泛
动画
多线程
集合遍历
网络请求
Block的作用
用来保存某一段代码, 可以在恰当的时间再取出来调用
功能 类似 函数 和 方法
*/
/**
2.block的格式
Block的定义
返回值类型(^block变量名)(形参列表) = ^ (形参列表){
};
*/
/**
3.
指向函数的指针
返回值 (*函数名)(形参) : *说明了到时候这个函数 是指向一个函数的指针
void (*roseP) ();
// void 代表指向的函数 没有返回值
// () 代表 指向的函数 没有形参
// (*roseP) 代表roseP 是一个 指向函数的指针
*/
pragma mark 代码
#import <Foundation/Foundation.h>
#pragma mark 类
#pragma 打印一个或者多个🌹的函数
void printRose() // 打印🌹
{
printf(" {@} \n");
printf(" | \n");
printf(" \\|/ \n");
printf(" | \n");
}
void printRoses(int num) // 打印多个🌹
{
for (int i = 0; i < num; i++) {
printf(" {@} \n");
printf(" | \n");
printf(" \\|/ \n");
printf(" | \n");
}
}
#pragma mark 计算两个数的和 返回和 的函数
int sum (int value1 , int value2)
{
return value1 + value2;
}
#pragma mark main函数
int main(int argc, const char * argv[])
{
// printRose();
#warning 指向 函数的 指针
/**
* void 代表指向的函数 没有返回值
* () 代表 指向的函数 没有形参
* (*roseP) 代表roseP 是一个 指向函数的指针
*/
// void (*roseP) ();
// // 指针 指向了函数
// roseP = printRose;
// // 直接调用指针
// roseP();
#warning 1.Block基本概念
// 定义一个Block变量,
// block和函数一样,
// 可以没有返回值,也没有形参 练习3
// 也可以 没有返回值 有形参 练习1
// 也可以 有返回值 没有形参 练习4
// 也可以 有返回值 有形参 练习2
// 所以, 在定义一个block变量的时候, 也需要告诉 该变量将来保存的代码 有没有返回值和形参
// void 代表block将来保存的代码 没有返回值 \
()代表block将来保存的代码 没有形参 \
(^roseBlock) 代表roseBlock 是一个block变量, 可以用于保存 一段block代码
#warning 2.Block变量
void (^roseBlock) ();
/**
block 其实跟基本数据类型定义变量 差不多
例如:
基本数据类型
int a = 10;
int 是 基本数据类型
a 是变量 相当于 void (^roseBlock) ();
10 是值 相当于
roseBlock = ^{
printf(" {@} \n");
printf(" | \n");
printf(" \\|/ \n");
printf(" | \n");
};
*/
#warning 3.Block类型的值
// roseBlock 变量 后面要添加;
// {} 这个 代码段 只能保存 block的代码段 需要在代码段前面添加一个 ^
// ^() 其中 ()代表的是参数列表 如果没有参数可以不写
roseBlock = ^(){
printf(" {@} \n");
printf(" | \n");
printf(" \\|/ \n");
printf(" | \n");
};
#warning 4.调用Block
// 要想执行block保存的代码,必须调用block才会执行
// roseBlock();
#pragma mark 1.练习 (没有返回值 和 带有参数 的Block)
#warning 使用 指向函数的指针 打印多个🌹 [带有参数的 指向函数的指针]
/** 打印多个🌹*/
// printRoses(10);
// 指向 函数的 指针
// void (*roseP)(int);
// roseP = printRoses;
// roseP(2);
#warning 使用 Block 打印多个🌹 [带有参数的 Block]
// 定义一个Block 变量 (类型 [类型的名称可以不要])
void (^roseBlocks) (int);
// block保存代码 使用代码块保存起来 {}
// 需要代码块 知道是一个 block 则 代码块前面需要添加一个尖括号 ^(类型 类型名称){}
roseBlocks = ^(int num){
for (int i = 0; i < num; i++) {
printf(" {@} \n");
printf(" | \n");
printf(" \\|/ \n");
printf(" | \n");
}
};
// roseBlocks(2);
#pragma mark 2.练习 (有返回值 和 带有参数 的Block)
#warning 指向函数的指针 打印两个数的和 (函数带有返回值、形参)
// 指向函数的指针(带有返回值、带有形参)
int (*sumP)(int, int);
sumP = sum;
// NSLog(@"sum = %i",sumP(20,35));
#warning Block 打印两个数的和 (代码块带有返回值、形参)
int (^sumBlock) (int,int);
sumBlock = ^(int value1, int value2){
return value1 + value2;
};
// int a = sumBlock(22,22);
// NSLog(@"sum = %i",a);
// NSLog(@"sum = %i",sumBlock(22,22));
#pragma mark 3.练习 (没有返回值 和 没有参数 的Block)
#pragma mark 4.练习 (有返回值 和 没有参数 的Block)
#pragma mark 其他
#warning 1.Block的初始化方式-1 (先定义 再 初始化)
// block 是一种数据类型
void (^printLineBlock)(int);
printLineBlock = ^(int num){
for (int i = 0; i < num; ++i) {
printf("----------\n");
}
};
printLineBlock(2);
#warning 1.Block的初始化方式-2 (定义的同时初始化)
void (^printLineBlock2)(int)= ^(int num){
for (int i = 0; i < num; ++i) {
printf("-----👍-----\n");
}
};
printLineBlock2(3);
#warning 2.Block的形参 可以带有返回值类型 (一般情况都不会写)
/**
int(返回值类型) (^printLineBlock3)(int)= ^int(形参列表:返回值类型) (int num)
*/
int (^printLineBlock3)(int)= ^int (int num){
for (int i = 0; i < num; ++i) {
printf("-----👍-----\n");
}
return 1;// 返回值
};
printLineBlock3(3);
/**
基本数据类型
两种初始化方式
1.定义的同时初始化
int a = 10;
2. 先定义 再 初始化
int b;
b = 30;
*/
return 0;
}