博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[iOS] [OC] 使用 block 实现函数嵌套
阅读量:6005 次
发布时间:2019-06-20

本文共 1861 字,大约阅读时间需要 6 分钟。

函数嵌套

在 Swift 中,在函数内部定义一个函数即函数嵌套,举例如下:

func foo() {     var a = 1      func bar() {             a += 1      }     bar()}复制代码

在 OC 中没有这类特性,不过如果联想到 Swift 中函数实际是一种有名字的闭包,那么函数嵌套的思想就可以延伸到 OC 语言中了。

OC 函数嵌套的实现

- (void)foo {     __block NSInteger a = 1;     void(^bar)(void) = ^{             a += 1;      };      bar();}复制代码

由此可见,将嵌套的函数逻辑封装到一个 block,这样就可以在需要时直接调用 block,而不需要另外声明一个方法了。

应用场景的延伸

凡用到嵌套函数的场景,往往也是这一段需要在一个函数/方法的内部多次使用逻辑,不需要外界知晓,比如:

  • 地址格式化逻辑
  • 日期格式化
  • 数据解析操作

这些 block 变量就像一个个小函数一样随时调用,举个应用的例子:

NSString *(^formatDate)(NSDate *) = ^NSString *(NSDate *date) {        NSString *str = [date formatYMD];        return str ?: @"";    };        NSString *(^formatStamp)(NSString *) = ^NSString *(NSString *stamp){        NSDate *date = [NSDate dateWithTimeIntervalSince1970:stamp.doubleValue];        return formatDate(date);    };        userInfo = @{                 kCellLeftTitle : @"起运时间",                 kCellRightContent : formatStamp(self.model.from_begin_time),                 kCellModelKey : [NSDate dateWithTimeIntervalSince1970:self.model.from_begin_time.doubleValue],                 kTextFieldDisableKey : @YES,                 kHasIndicatorKey : @YES,                 };    row.didSelectCellBlock = ^(NSIndexPath *indexPath, id value, id cell) {        WSDatePickerView *picker = [[WSDatePickerView alloc] initWithDateStyle:DateStyleShowYearMonthDay                                                                 CompleteBlock:^(NSDate *selected) {            value[kCellModelKey] = selected;            value[kCellRightContent] = formatDate(selected);            [weakSelf.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];        }];        picker.selectedDate = value[kCellModelKey];        [picker show];    };复制代码

上述代码中是在一个方法体的内部,声明了两个 block 变量做嵌套函数使用,分别是 formatDate 和 formatStamp,用于处理模型数据中的 日期和时间戳的字符串表示逻辑。

转载地址:http://qcpmx.baihongyu.com/

你可能感兴趣的文章
判断radiobutton是否被选中
查看>>
配置 SSH Key ☞ GitHub
查看>>
操作系统思考 第零章 前言
查看>>
kmdjs和循环依赖
查看>>
Handler 系列二:怎么通信
查看>>
WorkPlus JS SDK
查看>>
Elm 架构教程
查看>>
3. C语言 -- 叫你一声你敢答应嘛
查看>>
Android Handler机制(不含源码解析,适合新手理解)
查看>>
ios json转model的简单现实
查看>>
时隔一年,jQuery 发布 3.4.0 版本
查看>>
汤晓鸥为CNN搓了一颗大力丸
查看>>
Android Studio工具修理集
查看>>
Markdown中超链接增加_blank的方法
查看>>
机器人都能造飞机了,你还在呼呼大睡?
查看>>
linux 内核的链表操作(好文不得不转)
查看>>
《泛在服务 ,平台创新》移动电商生态研究报告
查看>>
JVM学习系列:了解JVM options参数配置 & 看懂GC日志
查看>>
12C 对表分区维护的增强
查看>>
算术运算表达式正则及分析
查看>>