前端之家收集整理的这篇文章主要介绍了
Swift学习笔记-函数和闭包(2),
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
//1.函数类型
//定义一个变量(Int,Int) -> Int
var myFun : (Int,Int) -> Int
//定义一个变量(String)-> Void
var test : (String) -> Void
//计算一个乘方的函数
func pow(#base : Int,#exponent : Int) -> Int
{
var result = 1
for i in 1...exponent
{
result *= base
}
return result
}
//将pow函数赋值给myFun,把myFun当成pow使用
myFun = pow
println("\(myFun(3,4))")//81
//定义一个计算面积的函数
func area(#width : Int,#height : Int) -> Int
{
return width * height
}
myFun = area
println(myFun(3,6))//18
//2.使用函数类型作为形参类型
func map(var #data : [Int],#fn : (Int) ->Int) ->[Int]
{
//遍历data数组中的每一个元素,并用fn函数对data[i]进行计算
//然后将计算结果作为新的数组元素
for var i = 0,len = data.count ; i < len; i++
{
data[i] = fn(data[i])
}
return data
}
//定义一个计算平方的函数
func square(val: Int) ->Int
{
return val * val
}
var data : Array = [3,5,4,7,9]
println("\(map(data:data,fn:square))")//[9,25,16,49,81]
//3.使用函数类型作为返回值类型
//计算平方的
func square1(val : Int) -> Int
{
return val * val
}
//计算立方的
func cube(val : Int) -> Int
{
return val * val * val
}
//定义一个返回值类型为(Int)-> Int
func getMathFunc(#type:String) ->(Int) ->Int
{
switch (type)
{
case "square":
return square1
default:
return cube
}
}
var mathFunc = getMathFunc(type: "square")
println(mathFunc(5))//25
//3.当函数名相同,形参列表或者返回值类型不同,都是两个不同的函数,被称为函数重载,注意包含了个数可变的形参
func test(msg :String)
{
println("这是test()函数")
}
func text(booksName:String...)
{
println("个数可变形参test()")
}
//报错
//test()
//test("b","a")
//4.嵌套函数,在函数体内部定义的函数
func getMath(#type:String) ->(Int) ->Int
{
//定义一个计算平方的函数
func square(val : Int) -> Int
{
return val * val
}
func cube(val:Int) -> Int
{
return val * val * val
}
switch (type)
{
case "squ":
return square
default:
return cube
}
}
var mathFun = getMath(type: "squ")
println(mathFun(5))//25
var math = getMath(type: "othe")
println(math(5))//125
//函数闭包表达式
/**
* 1.无需func关键字,无需指定函数名
* 2.定义闭包需要额外使用in关键字
* 3.定义闭包的第一个花括号要移到形参列表的圆括号之前
*/
func getMat(#type:String) ->(Int) ->Int
{
switch (type)
{
case "squ":
return {
(val:Int) -> Int in
return val * val
}
default:
return {(val : Int) -> Int in
return val * val * val}
}
}
//2,调用闭包(使用闭包返回值)
//定义一个闭包,并为闭包表达式的形参定义外部形参名
//然后将闭包赋值给square2变量
var square2 = { (value val:Int) ->Int in
return val * val
}
println(square2(4))//16
//使用闭包表达式定义闭包,并在闭包表达式后面添加圆括号来调用该闭包
var result2 = {(#base : Int,#exponent : Int) -> Int in
var result = 1
for i in 1...exponent
{
result *= base
}
return result
}(4,5)
println(result2)//1024
//3.利用上下文推断类型
//swift可以推断闭包表达式的形参类型,返回值类型
//闭包表达式可以省略形参类型,返回值类型
var square3:(Int) ->Int = {val in return val * val}
println(square3(4))//16
var result4:Int = { base,exponent in
var result = 1
for i in 1...exponent
{
result *= base
}
return result
}(4,5)
println(result4)//1024
//省略return,当闭包表达式只有一行代码的时候,可以省略return关键字
var squrae4 : (Int) -> Int = {val in val * val}
println(squrae4(5))//5
//4.尾随闭包
func map1(var #data : [Int],fn : (Int) ->Int) -> [Int]
{
//遍历data数组的每一元素,使用fn函数对data[i]进行计算
for var i = 0,len = data.count; i < len; i++
{
data[i] = fn(data[i])
}
return data
}
var data1 = [3,8,9,14,15,16]
println("计算数组的平方")
var rvt1 = map1(data: data){$0 * $0}
println(rvt1)//[9,81]
// $0,$1,$2,代表闭包函数的第一,2,3个形参
var rvt2 = map1(data: data1){
var result = 1
for index in 2...$0
{
result *= index
}
return result
}
println(rvt2)//[6,24,40320,362880,87178291200,1307674368000,20922789888000]
//5.捕捉上下文德变量和常量
//定义一个返回值类型是()->[String]
func makeArray(ele:String) -> () ->[String]
{
//创建一个不含任何函数的数组
var arr:[String] = []
func addElement() ->[String]
{
arr.append(ele)
return arr
}
return addElement
}
let add1 = makeArray("good")
println(add1())//[good]
println(add1())//[good,good]
原文链接:https://www.f2er.com/swift/327037.html