<span style="font-size:24px;">//函数
//demo1 无參数类型
func testConcat(){
    println("測试函数");
}

testConcat()//调用demo1

//demo2 多參数,一个返回值
/*
    函数以func开头,表示一个函数
    v1表示參数。String參数类型
    ->返回值类型String

*/
func testConcats(v1:String,v2:String) ->String{
    return "\(v1) and \(v2)";
}

//函数參数含有标签
func testConcatAndMark(v1:String,AndValue v2:String,AndNumber v3:String)->String{
    
    return "\(v1),\(v2),\(v3)"
}

//測试函数
func testFunction(){
    let v = testConcats("hello", "world");
    println(v);
    let v2 = testConcatAndMark("david", AndValue: "dream", AndNumber: "good");
    println(v2)
}

testFunction();

//函数返回多值
func getInfo()->(String,String,Int){
    return ("david","dream",100);
}

let (v1,v2,v3)=getInfo();
println("v1=\(v1),v2=\(v2),v3=\(v3)");

//函数嵌套函数
func testFunctionInFunction()->Int{
    var y = 10;
    func add(){
        y+=5;
    }
    add();
    return y;
}

let v6 = testFunctionInFunction();

//*******************************
//函数指针 *****五星难度
/*
    返回值是(Int->Int)。是个函数地址
    第一个int是參数类型,第二个int是返回值
*/
func getFuncPointer()->(Int->Int) {
    func addOne(num:Int)->Int{
        return num+1;
    }
    return addOne;//返回一个函数 地址
}

var funPointer = getFuncPointer();
//funPointer是个函数指针
var v7 = funPointer(100);//函数的形式调用

func get()->(Int->String){
    func post(count:Int)->String{
        if count>50{
            return "success";
        }else{
            return "failed"
        }
    }
    return post;
}

let v8 = get();//v8拿到的是get()函数的地址
let v9 = v8(58);//v9拿到的是get函数的返回值

//函数指针/地址作为參数,函数作为參数传给函数。函数的传递</span>
<span style="font-size:24px;">
</span>
<span style="font-size:24px;">//闭包是难点,闭包的作用主要是函数与函数之间的沟通,有点像Block</span>
<span style="font-size:24px;"></span><pre name="code" class="objc">//(num:Int)->Bool闭包參数类型
func hasColsureMatch(arr:Int[],value:Int,cb:(num:Int)->Bool){
    for item in arr{
        if cb(item){
            return true;
        }
    }
    return false;
}

var ar = [20,9.100,34,89,39];

var v1 = hasClosureMatch(arr,40,{
    (num:Int) -> Bool in
    return num >= 40;
});

println("v1 is \(v1)");