内容简介:在 Swift 中,在函数内部定义一个函数即函数嵌套,举例如下:在 OC 中没有这类特性,不过如果联想到 Swift 中函数实际是一种有名字的闭包,那么函数嵌套的思想就可以延伸到 OC 语言中了。由此可见,将嵌套的函数逻辑封装到一个 block,这样就可以在需要时直接调用 block,而不需要另外声明一个方法了。
在 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,用于处理模型数据中的 日期和时间戳的字符串表示逻辑。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- golang 嵌套匿名函数实现递归 2020-07-16 (未允禁转)
- Node.JS中回调嵌套和async/await执行空函数性能效率对比测试
- node.js将回调函数嵌套,用promise改造成async/await顺序执行:异常处理和返回多个参数
- Python 循环嵌套
- MyBatis嵌套查询解析
- MyBatis嵌套查询解析
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。