在这个例子中,我们要展示一个UIAlertView
,并且当用户按下确认按钮时要执行一个动作。过程式方法做到这一点需要先创建一个UIAlertView
对象,设置委托并实现回调,显示UIAlertView
,然后释放。
UIAlertView
示例(过程式)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
-(IBAction) buttonTapped:(id) sender {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Send email"
message:@"Are you sure you want to send it now?"
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"Send", nil];
[alert show];
[alert release];
}
-(void)alertView:(UIAlertView*) alertView didDismissWithButtonIndex:(NSInt
eger) buttonIndex {
if(buttonIndex != [alertView cancelButtonIndex]) {
[self sendTheMail];
}
}
-(void) sendTheMail {
// 发送邮件的代码
}
|
先不管实现(和语法),现在看看怎么调用一个遵循函数式范式的UIAlertView
。
UIAlertView
示例(函数式)
1 2 3 4 5 6 7 8 9 |
[UIAlertView showAlertViewWithTitle:@"Send email"
message:@"Are you sure you want to send it now?"
cancelButtonTitle:@"Cancel"
otherButtonTitles:[NSArray arrayWithObjects:@"Send", nil] onCompletion:^{
// 发送邮件的代码
}
onCancel:^{
// 处理其他情况的代码
}];
|
这样清楚多了。
- 不需要实现委托。
- 不需要分配或释放对象。
- 不需要明确地显示警告对话框。
只要说明你的意图,它就会在幕后自动执行。
在函数式编程的例子中,代码读起来像人类语言。以声明方式指定标题、需要显示的消息。当用户关闭警告对话框时,又有你声明的两种方式下需要执行的代码。无论是用户接受并关闭,还是取消并关闭,都不用实现委托。
重点是你只需要说明意图,而不用发出指令,而且代码读起来更清晰易懂。
想象一下,如果一个视图控制器需要显示多个警告对话框,同时又要在回调委托中用标签(tag)来区分不同的警告对话框……相信你已经体会到这段代码的妙处了。理解了这一点,你就抓住函数式编程的本质了。
在“基于块的UIAlertView”中,你会学习如何把这个方法实现为UIAlertView
的分类方法,还有语法以及其他相关的东西。
你可能会想,既然微处理器最终还是一条一条地执行指令,那为什么还要用函数式编程呢?这是个好问题。函数式编程基本就是为了写出对合作开发者来说易读易懂的代码。可以肯定,等价的命令式逻辑执行效率更高。但根据摩尔定律,微处理器的速度增长很快。因此代码的清晰易读通常要比性能重要。还有,这并不意味着你只能用函数式编程。并不是现实中的所有问题都能用函数方式表达。