Swift学习笔记-函数和闭包(2)

前端之家收集整理的这篇文章主要介绍了Swift学习笔记-函数和闭包(2)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. //1.函数类型
  2. //定义一个变量(Int,Int) -> Int
  3. var myFun : (Int,Int) -> Int
  4. //定义一个变量(String)-> Void
  5. var test : (String) -> Void
  6.  
  7. //计算一个乘方的函数
  8. func pow(#base : Int,#exponent : Int) -> Int
  9. {
  10. var result = 1
  11. for i in 1...exponent
  12. {
  13. result *= base
  14. }
  15. return result
  16. }
  17.  
  18. //将pow函数赋值给myFun,把myFun当成pow使用
  19. myFun = pow
  20. println("\(myFun(3,4))")//81
  21.  
  22. //定义一个计算面积的函数
  23. func area(#width : Int,#height : Int) -> Int
  24. {
  25. return width * height
  26. }
  27. myFun = area
  28. println(myFun(3,6))//18
  29.  
  30. //2.使用函数类型作为形参类型
  31. func map(var #data : [Int],#fn : (Int) ->Int) ->[Int]
  32. {
  33. //遍历data数组中的每一个元素,并用fn函数对data[i]进行计算
  34. //然后将计算结果作为新的数组元素
  35. for var i = 0,len = data.count ; i < len; i++
  36. {
  37. data[i] = fn(data[i])
  38. }
  39. return data
  40. }
  41.  
  42. //定义一个计算平方的函数
  43. func square(val: Int) ->Int
  44. {
  45. return val * val
  46. }
  47.  
  48. var data : Array = [3,5,4,7,9]
  49. println("\(map(data:data,fn:square))")//[9,25,16,49,81]
  50.  
  51. //3.使用函数类型作为返回值类型
  52. //计算平方的
  53. func square1(val : Int) -> Int
  54. {
  55. return val * val
  56. }
  57. //计算立方的
  58. func cube(val : Int) -> Int
  59. {
  60. return val * val * val
  61. }
  62. //定义一个返回值类型为(Int)-> Int
  63. func getMathFunc(#type:String) ->(Int) ->Int
  64. {
  65. switch (type)
  66. {
  67. case "square":
  68. return square1
  69. default:
  70. return cube
  71.  
  72. }
  73. }
  74. var mathFunc = getMathFunc(type: "square")
  75. println(mathFunc(5))//25
  76. //3.函数名相同,形参列表或者返回值类型不同,都是两个不同的函数,被称为函数重载,注意包含了个数可变的形参
  77. func test(msg :String)
  78. {
  79. println("这是test()函数")
  80. }
  81. func text(booksName:String...)
  82. {
  83. println("个数可变形参test()")
  84. }
  85. //报错
  86. //test()
  87. //test("b","a")
  88.  
  89. //4.嵌套函数,在函数体内部定义的函数
  90. func getMath(#type:String) ->(Int) ->Int
  91. {
  92. //定义一个计算平方的函数
  93. func square(val : Int) -> Int
  94. {
  95. return val * val
  96. }
  97.  
  98. func cube(val:Int) -> Int
  99. {
  100. return val * val * val
  101. }
  102.  
  103. switch (type)
  104. {
  105. case "squ":
  106. return square
  107. default:
  108. return cube
  109. }
  110. }
  111. var mathFun = getMath(type: "squ")
  112. println(mathFun(5))//25
  113. var math = getMath(type: "othe")
  114. println(math(5))//125
  115.  
  116. //函数闭包表达式
  117. /**
  118. * 1.无需func关键字,无需指定函数
  119. * 2.定义闭包需要额外使用in关键字
  120. * 3.定义闭包的第一个花括号要移到形参列表的圆括号之前
  121. */
  122.  
  123. func getMat(#type:String) ->(Int) ->Int
  124. {
  125. switch (type)
  126. {
  127. case "squ":
  128. return {
  129. (val:Int) -> Int in
  130. return val * val
  131. }
  132. default:
  133. return {(val : Int) -> Int in
  134. return val * val * val}
  135. }
  136. }
  137.  
  138. //2,调用闭包(使用闭包返回值)
  139. //定义一个闭包,并为闭包表达式的形参定义外部形参名
  140. //然后将闭包赋值给square2变量
  141. var square2 = { (value val:Int) ->Int in
  142. return val * val
  143. }
  144. println(square2(4))//16
  145.  
  146. //使用闭包表达式定义闭包,并在闭包表达式后面添加圆括号来调用该闭包
  147. var result2 = {(#base : Int,#exponent : Int) -> Int in
  148. var result = 1
  149. for i in 1...exponent
  150. {
  151. result *= base
  152. }
  153. return result
  154. }(4,5)
  155. println(result2)//1024
  156.  
  157. //3.利用上下文推断类型
  158. //swift可以推断闭包表达式的形参类型,返回值类型
  159. //闭包表达式可以省略形参类型,返回值类型
  160. var square3:(Int) ->Int = {val in return val * val}
  161. println(square3(4))//16
  162.  
  163. var result4:Int = { base,exponent in
  164. var result = 1
  165. for i in 1...exponent
  166. {
  167. result *= base
  168. }
  169. return result
  170. }(4,5)
  171. println(result4)//1024
  172.  
  173. //省略return,当闭包表达式只有一行代码的时候,可以省略return关键字
  174. var squrae4 : (Int) -> Int = {val in val * val}
  175. println(squrae4(5))//5
  176.  
  177. //4.尾随闭包
  178. func map1(var #data : [Int],fn : (Int) ->Int) -> [Int]
  179. {
  180. //遍历data数组的每一元素,使用fn函数对data[i]进行计算
  181. for var i = 0,len = data.count; i < len; i++
  182. {
  183. data[i] = fn(data[i])
  184. }
  185. return data
  186. }
  187.  
  188. var data1 = [3,8,9,14,15,16]
  189. println("计算数组的平方")
  190.  
  191. var rvt1 = map1(data: data){$0 * $0}
  192. println(rvt1)//[9,81]
  193. // $0,$1,$2,代表闭包函数的第一,23个形参
  194. var rvt2 = map1(data: data1){
  195. var result = 1
  196. for index in 2...$0
  197. {
  198. result *= index
  199. }
  200. return result
  201. }
  202.  
  203. println(rvt2)//[6,24,40320,362880,87178291200,1307674368000,20922789888000]
  204.  
  205. //5.捕捉上下文德变量和常量
  206. //定义一个返回值类型是()->[String]
  207. func makeArray(ele:String) -> () ->[String]
  208. {
  209. //创建一个不含任何函数的数组
  210. var arr:[String] = []
  211. func addElement() ->[String]
  212. {
  213. arr.append(ele)
  214. return arr
  215. }
  216. return addElement
  217. }
  218.  
  219. let add1 = makeArray("good")
  220. println(add1())//[good]
  221. println(add1())//[good,good]

猜你在找的Swift相关文章