//
//  FunctionUsage.swift
//  SwiftCode
//
//  Created by Alisa on 2020/8/31.
//  Copyright © 2020 Alisa. All rights reserved.
//

import Foundation

class FunctionUsage: NSObject {
    
    //函数类型:每一个函数都有一个特定的函数类型,它由形式参数类型,返回类型组成。
    func addTwoInts(a : Int, b : Int) -> Int{
        return a + b
    }
    func multiplyTwoInts(a : Int, b : Int) -> Int {
        return a * b
    }
    //上方这两个函数的类型一样,都是(Int, Int) -> Int
    
    //函数的类型作为形式参数类型
    func printMutiplyTwoIntsResult(mutiplyfunction: (Int, Int) -> Int, a : Int, b : Int){
        print("mutiply result is \(mutiplyfunction(a, b))")
        //
    }
    
    /*
     内嵌函数:可以在函数内部,定义另一个函数
     内嵌函数在一般情况下在外部是被隐藏起来的,但却人人可以通过包裹他们的函数来调用他们。
     包裹的函数也可以返回内部的一个内嵌函数来在外面的范围使用
     
   */
    //内嵌函数的使用
    func functionNeiQianWork() {
        var currentValue = -4
        let moveNearerToZear = chooseStepFunction(backward: currentValue > 0)
        while currentValue != 0 {
            print("currentValue = \(currentValue)")
            currentValue = moveNearerToZear(currentValue)
        }
    }
    func chooseStepFunction(backward : Bool) -> (Int) -> Int{
        func stepForward(input : Int) -> Int{
            return input + 1
        }
        func stepBackWard(input : Int) -> Int{
            return input - 1
        }
        return backward ? stepForward : stepBackWard
    }
}