var area=0
func rectangleArea(width:Int,height:Int)->Int{
return width*height;
}
area=rectangleArea(30, 40);
// -------------------------------------
//默认情况下函数参数都是常量,不可以修改,在前面加上var,既可以变为变量参数,在函数体里可以修改
func rectangleArea( var width:Int,height:Int)->Int{
return (width++)*height;
}
area=rectangleArea(30, 40);
// -------------------------------------
func rectangleArea1(W width:Int,H height:Int)->Int{ //加上外部参数
return width*height;
}
area=rectangleArea1(W: 30, H: 40);
// -------------------------------------
func rectangleArea2(#width:Int,#height:Int)->Int{ //将内部参数默认为外部参数
return width*height;
}
area=rectangleArea2(width: 30, height: 40);
// -------------------------------------
func rectangleArea3(width:Int=60,H height:Int=50)->Int{ //有默认值的参数在调用函数的时候需要加上外部参数或者内部参数来赋值
return width*height;
}
area=rectangleArea3(width: 40,H: 60);// 2400 有默认值的参数在调用函数的时候需要加上形参:形式来赋值
area=rectangleArea3(); //3000
area=rectangleArea3(width: 40); //2000
area=rectangleArea3(H: 60); //3600
// -------------------------------------
func rectangleArea4(width:Int=50,height:Int)->Int{
return width*height;
}
area=rectangleArea4(60); //3000, width默认50,高度为60
area=rectangleArea4(width:40,60); //2400
// -------------------------------------
func rectangleArea5(W width:Int=50,_ height:Int=8)->Int{ //默认形参前加上下划线,调用时候不用写形参或者外部参数
return width*height;
}
area=rectangleArea5(W:60,30); //1800 默认形参前加上下划线,调用时候不用写形参或者外部参数
area=rectangleArea5(W:60); //480 默认形参前加上下划线,调用时候不用写形参或者外部参数
area=rectangleArea5(); //400
area=rectangleArea5(60); //3000
// -------------------------------------
可变参数:
func sum(num:Int...)->Int{ num为一个Int数组
var total=0;
for item in num{
total+=item;
}
return total;
}
var sum1=sum(1,2,3,4,5,6); //可以输入任意多个参数
函数参数的传递引用
func increment(inout value:Double,amount:Double=1.0){ //inout 代表传递参数指针(引用)
value+=amount;
}
var value:Double=10.0;
increment(&value); //前面要加上&,代表引用
println(value);
increment(&value, amount: 100.0);
println(value);
无返回值函数三种写法:
func noReturn(){
}
func noReturn1()->(){ //返回空的元组
}
func noReturn2()->Void{
}
多返回值函数
一种使用引用参数,另外是返回元组
func position(dt:Double,speed:(x:Int,y:Int))->(x:Int,y:Int){
var posx:Int=speed.x*Int(dt);
var posy:Int=speed.y*Int(dt);
return (posx,posy);
/*
var pos:(x:Int,y:Int);
pos.x=posx;
pos.y=posy;
return pos;
*/
}
let move=position(60.0, (10,-5));
函数作为函数返回值或者参数使用
func rectangleArea(width:Double,height:Double)->Double{
return width*height;
}
func triangleArea(bottom:Double,height:Double)->Double{
return bottom*height*0.5;
}
func getArea(type:String)->(Double,Double)->Double{ //返回一个函数,这个函数有两个Double参数,返回一个Double
var returnFunction:(Double,Double)->Double; //定义一个函数类型,有两个Double参数,返回一个Double
switch type{
case "rect":
returnFunction=rectangleArea;
case "tria":
returnFunction=triangleArea;
default:
returnFunction=rectangleArea;
}
return returnFunction;
}
var area:(Double,Double)->Double=getArea("tria");
println("area:\(area(10,15))");
func getAreaByFunc(funcName:(Double,Double)->Double,a:Double,b:Double)->Double{ //将函数作为参数
return funcName(a,b);
}
var result:Double=getAreaByFunc(triangleArea, 10, 15);
//函数重载
Swift函数只要在参数个数、类型,以及返回值的个数,类型有变化的情况下,都可以重载
func receive(i:Int){
println(i);
}
func receive(i:Double){
println(i);
}
func receive(i:Int)->Int{
return i;
}
func receive(i:Int)->Double{
return Double(i);
}
func receive(i:Int,j:Int){
println(i);
}
var a:()=receive(1);
var b:Void=receive(2.2);
var c:Int=receive(3);
var d:()=receive(2,3);
var e:Double=receive(4);
//函数嵌套
func calculate(opr:String)->(Int,Int)->Int{
var c=8;
//定义嵌套函数,作用域为此函内
func add(a:Int,b:Int)->Int{
return a+b+c;
}
func sub(a:Int,b:Int)->Int{
return a-b+c;
}
var resultFunc:(Int,Int)->Int;
switch opr{
case "+":
resultFunc=add;
case "-":
resultFunc=sub;
default:
resultFunc=add;
}
return resultFunc; //可以将嵌套函数作为返回值传递出去,这样就可以在此函数体外使用,这个函数体内的值(c)都可以被调用
}
let f1:(Int,Int)->Int=calculate("+");
var f1s=f1(1,2);
println("\(f1(1,2))");
let f2:(Int,Int)->Int=calculate("-");
var f2s=f1(2,1);
println("\(f2(2,1))");
//泛型和泛型函数
func isEquals<T:Comparable>(a:T,b:T)->Bool{ //T代表泛型,Comparable为遵守的协议
return (a==b);
}
var isE=isEquals(2, 2);
isE=isEquals(3.5, 4.0);
isE=isEquals("ddd", "ddd");
func add<T,U>(a:T,b:U)->(T,U){ //两个泛型,返回值也为泛型
return (a,b)
}
var a1:(Int,Double)=add(2, 4.0);
var a2:(String,Int)=add("sdf", 4);
//泛型可以做一些约束行为,比如继承某个类的泛型,遵守某个协议的泛型,使用方法如下:
func add<T:SomeClass,U:SomeProtocol>(a:T,b:U)->(T,U){ //U是继承SomeClass类的类型,U是遵守SomeProtocol协议的类型
return (a,b)
}
//泛型不仅可以用在函数上,看也可以用在类、结构体的定义上。
//如果泛型是收到约束的,可以使用where语句来进行进一步的约束
func add<T:SomeClass ,U:SomeProtocol where T.abc!=0 && U.func()>0 >(a:T,b:U)->(T,U){ //U是继承SomeClass类的类型,U是遵守SomeProtocol协议的类型
return (a,b)
}
[此贴子已经被作者于2014/10/13 17:23:24编辑过]