/*------------------------------函数------------------------------*/
func sayHello(name :String) -> String // -> 后面的是返回值类型,前面的是函数的形参类型
{
return name +" Hello";
}
var Hint_hello =sayHello("Tom") ?? "NO RETURN" // 此处使用了空合并
println(Hint_hello)
func maxNum(num_1:Int , num_2:Int) -> Int
{
return num_1 > num_2 ? num_1: num_2; // 此处返回值调用了三目运算符
}
println(maxNum(12,10))
/*--------------------------函数的参数------------------------------*/
func area_n(width:Double, height :Double) ->Double
{
return width * height;
}
// width和height都是内部参数
println("调用内部参数函数\(area_n(1.2,2.5))");
//宽 和高 两个汉字作为area_w函数的外部参数,width和height作为area_w函数的内部参数
func area_w(宽 width:Double,高 height :Double) ->Double
{
return width * height;
}
//width和height都是内部参数,宽和高则是外部参数
println("调用外部参数函数 \(area_w(宽:1.4,高:1.8))")
//当外部参数和内部参数一致时,可以用#号代替
// width和height即为外部参数,又为内部参数
func area_s(#width:Double, #height:Double)->Double
{
return width * height
}
println("内,外部参数名一致\(area_s(width:1.3, height:1.5))")
/*----------------------可变参数---------------------*/
func sum(num :Int...) -> Int // ... 表示sum函数的传入参数个数可变
{
var sumInt :Int =0;
for itemin num
{
sumInt += item;
}
return sumInt
}
//一个可变参数的函数的形参最多只有一个,且放在形参列表的最后一个
println("可变参数函数计算结果\(sum(1,2,3,4,5,6,7,8,9))")
/*------------------默认参数的函数-----------------*/
func sayHi(msg:String, name : String ="Tom,") ->String // name为函数的默认参数,需要传入时,需要像外部参数一样,传入参数名称
{
return name + msg;
}
var msg_me ="welcome"
println("默认参数的函数\(sayHi(msg_me))")
var msg_name ="Jake "
println("默认参数函数传入参数\(sayHi(msg_me, name:msg_name))")
//默认参数的传入和外部参数一样,需要写出参数名 e.g. name
//若不想写默认参数的参数名,可以在前面加下划线+空格
func sayHiTo(msg:String,_ name :String ="Lily,")->String
{
return name + msg;
}
println("不写默认函数的默认参数名\(sayHiTo(msg_me,msg_name))")
/*
*如果一个函数中既有默认参数,又有可变参数,则他们的次序应该为:可变参数位于参数表的最后面,而默认参数在次后面
*/
/*--------------------常量形参和变量形参------------------------*/
//函数的传入参数默认为常量形参,在函数内部不能进行任何改变形参值的操作,
//若要修改形参的值,需要使用var修饰传入形参,成为变量形参
func calcualte(a :Int) -> Int // a没有var修饰,默认为常量形参
{
var b = a +1;
return a;
}
func calculate_num(var a :Int) ->Int // a有var修饰,为变量形参,在函数内部可以背修改
{
a++;
return a;
}
/*-------------------------In-Out形参----------------------------*/
// 使用inout类型修饰的参数,在函数内部的改变会影响原值的改变
// 和C/C++中的指针函数一样,会改变函数外的变量值
func swap(inout a:Int,inout b:Int)
{
let smp = a
a = b;
b = smp
}
var A =10;
var B =12
swap(&A, &B) // 进过swap运算过之后,A和B变量的值交换了
println("swap之后 A =\(A) AND B =\(B)")
/*------------------------函数返回值类型-----------------------*/
// 函数的返回值为一个元组,也就是说,函数可以以元组的方式,有多个返回值
func area(width: Double, height:Double) -> (A:Double, C:Double)
{
var a = width * height
var c = (width + height) *2
return (A:a , C:c)
}
var Area = area(1.2,2.4)
println("矩形的面积为\(Area.A) AND周长为\(Area.C)")
func calculateScore(var mathScore:Double, var englishScore:Double) -> (math:Double, english:Double)
{
mathScore *= 1.2
englishScore *= 1.2
return (math:mathScore, english:englishScore)
}
var score = calculateScore(90,85)
println("加分之后 Math =\(score.math) AND English =\(score.english)")
/*------------------------函数类型-----------------------*/
//函数作为变量
func addTwoNum(a: Int, b:Int) ->Int
{
return a + b
}
func multiplayTwoNum(a: Int, b:Int) -> Int
{
return a*b
}
// 声明了一个变量,其传入参数为(Int, Int),返回值类型 Int, 并将函数multiplayTwoNum初始化赋值给它
var calculateNum : (Int,Int) -> Int =multiplayTwoNum
println(calculateNum(3,5))
//函数作为函数形参
func mathResult(calculateNum:(Int,Int) -> Int, a:Int, b:Int)
{
println("计算结果:\(calculateNum(a, b))")
}
mathResult(multiplayTwoNum,2, 3)
//函数作为返回值
func squre(a: Int) ->Int
{
return a*a
}
func cube(a: Int) ->Int
{
return a*a*a
}
// type是函数getMathFunc的传入参数(外部参数,内部参数)
// 第一个->后面的是getMathFunc函数的返回值
// (Int) -> Int 这个表示一个函数, 此函数的形参类型为 (Int) , 而它的返回值为Int
func getMathFunc(#type: String) -> (Int) ->Int
{
switch(type)
{
case "squ":
returnsqure;
default:
return cube
}
}
var mathFunc = getMathFunc(type:"squ")
println("获得的值为\(mathFunc(4))")
/*--------------------函数的重载--------------------*/
func test()
{
println("无参数的test()函数")
}
func test(msg: String)
{
println("有参数的test()函数,传入参数为\(msg)")
}
func test(#msg: String)
{
println("有内部,外部参数的test()函数,传入参数为\(msg)")
}
func test(msg: String) ->String
{
println("有参数的test()函数,传入参数 \(msg)带返回值")
return msg
}
test()
var result :Void = test("Hello , Tom") // 此处需要说明返回值类型,否则报错
var res :String = test("Hi, Jake") // 此处需要说明返回值类型,否则报错
test(msg: "Kake")
/*--------------------函数的闭包--------------------*/
var result: Int = {
var result = 1
for i in 1...$0
{
result *= $1
}
return result
}(2, 3)
// 使用$0 , $1, $2 表示输入参数的第一个,第二个,第三个.....
var calResult :(Int, Int) -> Int = {
var result = 1;
for i in 1...$1
{
result *= $0
}
return result
}
println(calResult(3,4))