Swift方法的简写
来源:互联网 发布:hse培训矩阵课件 编辑:程序博客网 时间:2024/05/07 08:01
本文来自斯坦福大学的iOS公开课-02
首先举个例子,一个计算器,需要最基本的加减乘除运算,代码如下
import Foundation//取操作数,假设已经取到如下let op1 = 1.1;let op2 = 2.2;func operate(operation:NSString) { switch operation { case "+": performOperation(add) case "-": performOperation(subtract) case "×": performOperation(multiply) case "÷": performOperation(devide) default: break }}//处理运算func performOperation(operation:(Double, Double) -> Double) { let value = operation(op1, op2); //得到结果后的一些其他操作 NSLog("value = \(value)")}//×func multiply(op1:Double, op2:Double) -> Double { return op1 * op2}//÷func devide(op1:Double, op2:Double) -> Double { return op1 / op2}//+func add(op1:Double, op2:Double) -> Double { return op1 + op2}//-func subtract(op1:Double, op2:Double) -> Double { return op1 - op2}
一个operate
方法用来判断运算符,一个performOperation
方法用来处理运算,四个运算方法加减乘除。
接下来我们来简写。
第一步,省去多余函数
将add
方法体直接替换到operate
方法中。
需要注意三点,
1.直接把函数名之后的从括号开始全部移走
2.左花括号提到函数左括号前面
3.在原来左花括号的位置加一个单词in
//Step 1.直接把函数名之后的从括号开始全部移走 func operate(operation:NSString) { switch operation { case "+": performOperation((op1:Double, op2:Double) -> Double { return op1 + op2}) ... }}
//Step 2.左花括号提到函数左括号前面func operate(operation:NSString) { switch operation { case "+": performOperation({(op1:Double, op2:Double) -> Double return op1 + op2}) ... }}
//Step 3.在原来左花括号的位置加一个单词`in`func operate(operation:NSString) { switch operation { case "+": performOperation({(op1:Double, op2:Double) -> Double in return op1 + op2}) ... }}
现在的状态是没有红色报错的,并且改动处仍属于一条语句。
第二步,省去类型
因为Swift最厉害的地方就是类型推断,它可以通过上下文来推断一个变量的类型,所以根据上下文我们知道performOperation
方法的参数为operation:(Double, Double) -> Double
,即一个有两个Double
类型作参数,返回一个Double
类型的函数。
所以,我们可以把类型略掉,把返回类型去掉,箭头也当然要去掉。(这个和Lambda表达式有点类似)
func operate(operation:NSString) { switch operation { case "+": performOperation({(op1, op2) in return op1 + op2}) ... }}
又因为Swift知道里面的表达式一定是返回一个值,所以return
也可以不需要
func operate(operation:NSString) { switch operation { case "+": performOperation({(op1, op2) in op1 + op2}) ... }}
第三步,最简化
这时有人突然跑来看你的代码,觉得很奇怪,为什么这里好像是调用op1
和op2
在做某事,但是你都没有给他们定义呢(其实定义类型已经被我们略去了),那我们就干脆参数名也略掉吧。
在Swift中,会自动给参数顺序命名$0
,$1
,$2
…所以这里也可以把op1
,op2
替换成$0
,$1
,并且函数名也可以完全去掉了。
func operate(operation:NSString) { switch operation { case "+": performOperation({$0 + $1}) ... }}
和原来比简直简化到不能忍!!!
可以回到最前面看下原来的代码,然后再看下下面简化后的:
import Foundation//取操作数,假设已经取到如下let op1 = 1.1;let op2 = 2.2;func operate(operation:NSString) { switch operation { case "+": performOperation({ $0 + $1 }) case "-": performOperation({ $0 - $1 }) case "×": performOperation(){ $0 * $1 } //当参数为最后一个参数时,可以放在外面 case "÷": performOperation{ $0 / $1 } //如果只有它一个参数,甚至可以不需要小括号 default: break }}//处理运算func performOperation(operation:(Double, Double) -> Double) { let value = operation(op1, op2); //得到结果后的一些其他操作 NSLog("value = \(value)")}
细心的人注意到有个小小的变动,就是花括号刚好为performOperation
最后一个参数,所以花括号可以放在performOperation
的右括号外面;而如果只有一个参数的情况下,小括号可以去掉也没关系。
- Swift方法的简写
- 简写document.getElementById的方法
- 一个漂亮的boolean方法的简写
- if then else 的特殊简写方法
- 边框(border)的CSS简写方法
- JavaScript 判断为空的简写方法
- document.getElementById()方法简写
- document.getElementById()方法简写
- CSS简写方法说明
- [Swift]Swift的初始化方法
- Objective-C 【NSArray 的基本使用&常见方法&简写形式】
- Windows下文件名或目录的简写方法
- swift学习笔记之QQ简写
- 部分IT术语的英语简写与简写方法(整理一下最近遇到的一些IT术语)
- FONT的简写
- Jquery的代码简写
- 一些简写的全称
- 一些简写的全称
- Android 异步通信原理机制-- handler
- 【Mapreduce】以逗号为分隔符的WordCount词频统计
- js实现上传图片实时预览,兼容chrome IE firefox多浏览器
- iGia:smart home security kit
- 使用Quartz2.1.6+Spring3.0实现任务调度简单示例
- Swift方法的简写
- quartz 使用笔记
- LintCode :背包问题
- POJ 1470Closest Common Ancestors(LCA)
- 如何在低版本中适用Android 5.0设计Material风格
- ios开发中,xib加载view,loadNibNamed方法奔溃原因之一
- php面试题精髓
- Native method not found
- PHP获取客户端和服务器的IP地址