import Foundation
//函数本身被看作一个类型,可以将函数作为参数,可以在函数中返回一个函数。
//同样可以在函数中定义一个内部函数。Nested Function
//variadic 可变参数
//swift 用...可以接受可变参数,想其他语言类似,如果由可变参数,必须放在最后
//另外,可变参数必须是指定的相同类型的,在swift中是将其当作数组来处理的。
func variadicFunc(tst:Double, variadicPara:Int...)
{
print("可变参数为:")
for p in variadicPara
{
print("\(p) ")
}
println("")
}
variadicFunc(2.0,3,4,5,6)//4.0,"helo")都不可以,只能用相同的类型
//默认所有的函数的参数都是const的类型的,不能在函数内部当作变量来使用,如果想像C语言一样在函数中进行使用
//可以在前面加上var即可,这样的好处是可以少定义一个变量。但是值类型仍然不可作为输出参数。
var testdata =10
func varParameter(var varPara:Int, constPara:Int)
{
varPara +=3
//constPara += 3
println("varPara:\(varPara)可以当作局部变量用,我就少定义了一个内部变量,但是constPara不可以")
}
varParameter(testdata,3)
println("变量并没有在varParmeter中被修改 testdata:\(testdata)")
//⭐️⭐️ERROR 下面的函数会报错,因为Array是const的不能修改,在Xcode Beta1中是可以的。
func outputParameter(data:Array<String>)
{
data[0] ="hello"
}
//可以让值类型参数带出函数的方法 inout,需要在函数调用的参数前加&并且该参数不能是默认值参数,variadic参数
func inoutFunc(inout temp:Int)
{
temp +=10
}
println("Before inoutFunc testdata:\(testdata)")
inoutFunc(&testdata)
println("After inoutFunc testdata:\(testdata)")
//局部参数和外部参数,如果定义时使用了外部参数,则在函数调用时必须加上外部参数
//局部参数在函数内部用,外部参数在函数调用时用来说明local参数,使参数的作用等更加明确
func clearParameter(externalparameter_first fst:Int, externalparameter_second scnd:Int)
{
println("复杂的外部参数:\(fst+scnd)")
}
//定义了外部参数的函数,在函数调用时参数前面必须加上外部参数
clearParameter(externalparameter_first:3, externalparameter_second:4)
//clearParameter(5,5) 报错 定义了external parameter后,在调用时必须加上。
//如果形参本身就比较清晰,可以在行参前面简单的加上#,参数名即是外部也是内部参数
func clearParameter2(#firstdata:Int, seconddata:Int)
{
println("简洁的external parameter:\(firstdata+seconddata)")
}
clearParameter2(firstdata:3,4)
//无参数无返回值函数,没有返回值的函数在swift中会默认返回void,Void是一个空的tuple
func sayHello1()
{
println("hello1")
}
sayHello1()
//带有一个参数,一个返回值Int的函数,返回值用-> Type表示
func sayHello2(name:String)->Int
{
println("hello2:"+name)
return 1
}
sayHello2("dear")
//利用元组来返回多个返回值
func multipleReturn()->(data:Int,String,Int)
{
return (1,"hello",2)
}
var ret = multipleReturn()
println(ret.data)
println(ret.1)//第二个数据没有名字,所以不能通过名字来索引
println(ret.2)
//函数参数的默认值
func testFunc(p1:Int=2, p2:Int =4)
{
println("参数默认值testFunc\(p1+p2)")
}
testFunc()
//由上面可以看到,两个参数p1和p2都提供了默认参数,那么如果调用函数testFunc(3)那么这个
//参数应该时谁的值呢,没法确定!swift的做法是,每个带默认值的参数都默认的给添加了一个默认external parameter,这样当想给默认参数赋值的时候,就必须带着外部参数,例子:
testFunc(p1:10)//这样就可以给带默认参数的参数赋值啦
//函数类型 可与其他类型一样作为参数传递,函数返回值等使用。
//无参数无返回值类型参数,上面说过是void-空的tuple
var voidFunc:()->()
var twoParaFunc: (Int,Int)->()//有两个参数,没有返回值
var towParaFuncReturn: (Int,Int)->Int
func typeFuncTest(p1:Int, p2:Int)->Int
{
return p1+p2
}
towParaFuncReturn = typeFuncTest
println("Function Type Test\(towParaFuncReturn(11,12))")