函数类型
函数类型是一种引用类型,类似于函数指针,可以将函数类型应用在参数、变量、返回值等地方。
函数类型的定义:
(参数列表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可以调用全局函数、局部函数、静态函数(类方法)、实例方法。
也可以作为参数。