Swift基础 函数作为参数类型

函数类型

函数类型是一种引用类型,类似于函数指针,可以将函数类型应用在参数、变量、返回值等地方。
函数类型的定义:

(参数列表1,参数列表2,...)->返回值类型

示例代码:

class Person{
    
    
    var name : String
    init(personName: String) {
    
    
        name = personName
    }
}

class Student: Person {
    
    
    var classmate : Student?
    var behavior : ()->();   //声明behavior是无参数无返回值的函数类型
    
    
    override init(personName: String) {
    
    
        behavior = {
    
    }
        super.init(personName: personName)
    }
    
    func examine() -> () {
    
    
        print("\(name)要考试");
    }
    
    static func gotoClass()->Void{
    
    
        print("上课");
    }
}

func read() -> Void {
    
    
    print("读书");
}

func write() -> Void {
    
    
    print("写作");
}

//函数类型还可以作为参数
func arrange(student:Student,behavior1:()->(),behavior2:()->()) -> () {
    
    
    print("\(student.name)的安排计划:")
    behavior1()
    behavior2()
}

func morningReading() -> () {
    
    
    print("早读")
}

func math() -> () {
    
    
    print("上数学课")
}

func chinese() -> () {
    
    
    print("上语文课")
}

func english() -> () {
    
    
    print("上英语课")
}

func learning(index:Int)->(()->()){
    
    
    //带参数的,返回函数类型的返回值 的函数
    switch index {
    
    
    case 0:
        return morningReading;
    case 1:
        return math;
    case 2:
        return chinese;
    case 3:
        return english;
    default:
        return morningReading;
    }
}

class ViewController: UIViewController {
    
    
    override func viewDidLoad() {
    
    
        super.viewDidLoad()
        
        let xiaoHong = Student.init(personName: "xiaoHong")
        let xiaoMing = Student.init(personName: "xiaoMing")
        
        //只要函数类型和behavior声明的一致,就可以接收
        //其接收的类型可以是局部的、全局的、静态的、实例的等等
        xiaoHong.behavior = read
        xiaoHong.behavior()
        xiaoHong.behavior = write
        xiaoHong.behavior()
        
        //局部的函数
        func eat()->(){
    
    
            print("吃饭")
        }
        xiaoHong.behavior = eat                 //局部方法
        xiaoHong.behavior()
        
        xiaoHong.behavior = Student.gotoClass   //静态方法(类方法)
        xiaoHong.behavior()
        
        //实例方法,指向的是xiaoMing实例下的examine方法
        //所以我们可以看到输出是xiaoMing要考试
        xiaoHong.behavior = xiaoMing.examine
        xiaoHong.behavior()
        
        //因为learining函数返回的是 无参无返回值的函数类型
        //所以behavior可以接收
        xiaoHong.behavior = learning(index: 0)
        xiaoHong.behavior()
        xiaoHong.behavior = learning(index: 1)
        xiaoHong.behavior()
        xiaoHong.behavior = learning(index: 2)
        xiaoHong.behavior()
        xiaoHong.behavior = learning(index: 3)
        xiaoHong.behavior()
        
        //函数类型还恶意作为参数
        arrange(student: xiaoMing, behavior1: read, behavior2: write)

    }
}

从上述代码中可以看出,student类对象实例只需要给behavior函数类型的属性赋值不同的函数,就能够用同一个方法名实现不同的执行。
运行结果 :

读书
写作
吃饭
上课
xiaoMing要考试
早读
上数学课
上语文课
上英语课
xiaoMing的安排计划:
读书
写作

通过这样的方式behavior可以调用全局函数、局部函数、静态函数(类方法)、实例方法。
也可以作为参数。

猜你喜欢

转载自blog.csdn.net/kkkenty/article/details/124785559