面向协议编程
- 传统面向对象的开发思维方式是将类中相似的功能抽取出来,组成一个基类,然后子类继承与基类,就可以调用父类拥有的方法,而不必每次都写相同的方法,而iOS中并不支持多继承,所以继承了父类,就不可以再继承与其它类。例如:下面例子LGAnimal继承与NSObject,LGMonkey继承与LGAnimal,Monkey就可以重写父类的方法,实现自己的功能,也可以直接调用父类的方法
class LGAnimal: NSObject {
var leg:Int {return 4}
func run(){
print("\(leg)只脚奔跑")
}
func eat(){
print("肉")
}
}
class LGMonkey: LGAnimal {
override var leg: Int {return 2}
override func eat() {
print("?")
}
}
override func viewDidLoad() {
super.viewDidLoad()
let monkey = LGMonkey()
monkey.run()
monkey.eat()
}
- 而面向协议开发就不需要
- 首先定义一个协议比如LGProtocl,然后遵守自定义的协议,LGTeacher和LGStudent都遵守了LGProtocl协议,然后必须实现协议中的方法,否则会报错比如:Type ‘LGStudent’ does not conform to protocol ‘LGProtocl’
protocol LGProtocl {
/// 协议属性
var name: String {get}
/// 协议方法
func sayHello()
}
/// LGTeacher结构体来实现协议
struct LGTeacher: LGProtocl{
var name: String
func sayHello() {
print("你好")
}
}
struct LGStudent: LGProtocl {
var name: String
// func sayHello() {
// print("别烦我,我要学习POP")
// }
}
let array: [LGProtocl] = [LGTeacher(name: "Cooci"),LGStudent(name: "Jz")]
array.forEach{ $0.sayHello()}
- 总结:面向协议开发更加灵活,通过协议+扩展实现一个功能,能够定义所需要的充分必要条件,不多也不少。这样就最大程度减少了耦合。使用者可以像搭积木一样随意组合这些协议,写一个class或struct来完成复杂的功能
- 备注:struct和class的主要区别:
- struct是值引用,而class是类型引用
- struct没有继承的功能,class有继承功能