Swift方法的简写

前端之家收集整理的这篇文章主要介绍了Swift方法的简写前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

本文来自斯坦福大学的iOS公开课-02

首先举个例子,一个计算器,需要最基本的加减乘除运算,代码如下

  1. import Foundation
  2.  
  3. //取操作数,假设已经取到如下
  4. let op1 = 1.1;
  5. let op2 = 2.2;
  6.  
  7. func operate(operation:NSString) {
  8.  
  9. switch operation {
  10. case "+": performOperation(add)
  11. case "-": performOperation(subtract)
  12. case "×": performOperation(multiply)
  13. case "÷": performOperation(devide)
  14. default: break
  15. }
  16. }
  17.  
  18. //处理运算
  19. func performOperation(operation:(Double,Double) -> Double) { let value = operation(op1,op2); //得到结果后的一些其他操作 NSLog("value = \(value)") } //× func multiply(op1:Double,op2:Double) -> Double {
  20. return op1 * op2
  21. }
  22. //÷
  23. func devide(op1:Double,op2:Double) -> Double {
  24. return op1 / op2
  25. }
  26. //+
  27. func add(op1:Double,op2:Double) -> Double {
  28. return op1 + op2
  29. }
  30. //-
  31. func subtract(op1:Double,op2:Double) -> Double {
  32. return op1 - op2
  33. }

一个operate方法用来判断运算符,一个performOperation方法用来处理运算,四个运算方法加减乘除。

接下来我们来简写。

第一步,省去多余函数

add方法体直接替换到operate方法中。
需要注意三点,
1.直接把函数名之后的从括号开始全部移走
2.左花括号提到函数左括号前面
3.在原来左花括号的位置加一个单词in

  1. //Step 1.直接把函数名之后的从括号开始全部移走
  2. func operate(operation:NSString) {
  3.  
  4. switch operation {
  5. case "+": performOperation((op1:Double,op2:Double) -> Double {
  6. return op1 + op2
  7. })
  8. ...
  9. }
  10. }
  1. //Step 2.左花括号提到函数左括号前面
  2. func operate(operation:NSString) {
  3.  
  4. switch operation {
  5. case "+": performOperation({(op1:Double,op2:Double) -> Double
  6. return op1 + op2
  7. })
  8. ...
  9. }
  10. }
  1. //Step 3.在原来左花括号的位置加一个单词`in`
  2. func operate(operation:NSString) {
  3.  
  4. switch operation {
  5. case "+": performOperation({(op1:Double,op2:Double) -> Double in
  6. return op1 + op2
  7. })
  8. ...
  9. }
  10. }

现在的状态是没有红色报错的,并且改动处仍属于一条语句。

第二步,省去类型

因为Swift最厉害的地方就是类型推断,它可以通过上下文来推断一个变量的类型,所以根据上下文我们知道performOperation方法的参数为operation:(Double,Double) -> Double,即一个有两个Double类型作参数,返回一个Double类型的函数

所以,我们可以把类型略掉,把返回类型去掉,箭头也当然要去掉。(这个和Lambda表达式有点类似)

  1. func operate(operation:NSString) {
  2.  
  3. switch operation {
  4. case "+": performOperation({(op1,op2) in return op1 + op2})
  5. ...
  6. }
  7. }

又因为Swift知道里面的表达式一定是返回一个值,所以return也可以不需要

  1. func operate(operation:NSString) {
  2.  
  3. switch operation {
  4. case "+": performOperation({(op1,op2) in op1 + op2})
  5. ...
  6. }
  7. }

第三步,最简化

这时有人突然跑来看你的代码,觉得很奇怪,为什么这里好像是调用op1op2在做某事,但是你都没有给他们定义呢(其实定义类型已经被我们略去了),那我们就干脆参数名也略掉吧。

在Swift中,会自动给参数顺序命名$0,$1,$2…所以这里也可以把op1op2替换成$0,$1,并且函数名也可以完全去掉了。

  1. func operate(operation:NSString) {
  2.  
  3. switch operation {
  4. case "+": performOperation({$0 + $1})
  5. ...
  6. }
  7. }

和原来比简直简化到不能忍!!!

可以回到最前面看下原来的代码,然后再看下下面简化后的:

  1. import Foundation
  2.  
  3. //取操作数,假设已经取到如下
  4. let op1 = 1.1;
  5. let op2 = 2.2;
  6.  
  7. func operate(operation:NSString) {
  8.  
  9. switch operation {
  10. case "+": performOperation({ $0 + $1 })
  11. case "-": performOperation({ $0 - $1 })
  12. case "×": performOperation(){ $0 * $1 } //当参数为最后一个参数时,可以放在外面
  13. case "÷": performOperation{ $0 / $1 } //如果只有它一个参数,甚至可以不需要小括号
  14. default: break
  15. }
  16. }
  17.  
  18. //处理运算
  19. func performOperation(operation:(Double,Double) -> Double) {
  20. let value = operation(op1,op2);
  21. //得到结果后的一些其他操作
  22. NSLog("value = \(value)")
  23. }

细心的人注意到有个小小的变动,就是花括号刚好为performOperation最后一个参数,所以花括号可以放在performOperation的右括号外面;而如果只有一个参数的情况下,小括号可以去掉也没关系。

猜你在找的Swift相关文章