OC坑集之block作为函数参数
对于 OC(Objective-C,苹果推出的自家编程语言) 的争论一直不休,对于一门语言,我觉得只要能解决你的问题就够了。
评论一门编程语言的好坏之前,需要我们真正的去用它,OC 孰好孰坏,需要你自己去尝试。
OC 坑集,主要记载使用 OC 开发项目遇到的问题,尽量简洁明了,希望大家喜欢。
block
语句块可以作为函数的参数, 在项目中都经常被作为回调来使用。
如果你还不熟悉 block
语法,请自行 google,这里不讲 block
语法。我们下面直接进入主题。
创建一个 OC 类
1 2 3 4 5 6 7
| #import <Foundation/Foundation.h>
@interface FoolBar : NSObject
- (void)makeFool:(void(^)(NSString *))callback;
@end
|
1 2 3 4 5 6 7 8 9 10 11
| #import "FoolBar.h"
@implementation FoolBar
- (void)makeFool:(void (^)(NSString *))callback { NSLog(@"makeFool | callback."); callback(@"This is a block parameter."); }
@end
|
main.m
1 2 3 4 5 6 7 8 9 10 11 12
| #import <Foundation/Foundation.h> #import "FoolBar.h"
int main(int argc, const char * argv[]) { @autoreleasepool { FoolBar *fb = [[FoolBar alloc] init]; [fb makeFool:^(NSString *) { }]; } return 0; }
|
大家看到这里,应该觉得没什么问题。
我刚开始也是行事冲冲的,但编译器给了个大大的 Error, 大致意思是参数丢失。
经过一番思想上面的斗争,终于解决了问题。
在声明带有 block
语句的方法时,需要带上参数名称或者调用者自己写上参数名称。
1
| - (void)makeFool:(void(^)(NSString *param))callback;
|
重新给它整上,如下:
1 2 3 4 5 6 7 8 9 10 11 12
| #import <Foundation/Foundation.h> #import "FoolBar.h"
int main(int argc, const char * argv[]) { @autoreleasepool { FoolBar *fb = [[FoolBar alloc] init]; [fb makeFool:^(NSString *param) { NSLog(@"param = %@", param); }]; } return 0; }
|
使用 block
作为函数参数的时候,建议使用 typedef
定义 block
.
1
| typedef void (^OnFoolCallback)(NSString *name);
|
定义和实现
1
| - (void)productFool:(OnFoolCallback)callback;
|
1 2 3 4 5
| - (void)productFool:(OnFoolCallback)callback { NSLog(@"productFool | callback."); callback(@"This is a block parameter: mark."); }
|
测试和使用,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #import <Foundation/Foundation.h> #import "FoolBar.h"
int main(int argc, const char * argv[]) { @autoreleasepool { FoolBar *fb = [[FoolBar alloc] init]; [fb makeFool:^(NSString *param) { NSLog(@"param = %@", param); }]; [fb productFool:^(NSString *name) { NSLog(@"name = %@", name); }]; } return 0; }
|
盼望疫情早日结束,每个人都能回归到正常的生活当中去!