OC的核心是面向对象编程(OOP) Swift的核心是的面向协议编程(POP)
对比
面向对象or面向协议? 传统的面向对象思维方式: 有一只狗,有自己的名字, 可以跑 有一只猫,有自己的名字, 可以跑 有一个人,有自己的名字, 可以跑 抽象出一个动物类, 之后, 将跑的行为放入动物类中 如果需要一个吃的行为, 也可以抽象在动物类中 面向对象开发弊端 如果有一个机器人(一辆车), 也有跑的行为, 这个时候如何抽象呢, 显然该抽象方式并不是特别合理
面向对象开发核心是: 封装-继承-(多态) ,弊端:继承链很长,代码高度耦合 面向协议开发核心是: 模块化(组件化)
OC不能面向协议开发的原因是,OC中的协议只能有方法的声明,不能有方法的实现,而Swift可以通过协议拓展,来声明方法和实现方法,所以swift可以进行面向协议编程。 代码
protocol Emitterable {
}
//协议拓展
extension Emitterable{
/// 方法的声明和实现
func start() {
}
}
面向协议开发应用:
很多UIView会通过xib进行描述, 而我们经常需要从一个xib中加载UIView, 抽取单独的协议, 需要从xib中加载类, 只需要遵守协议即可,而不需要继承自父类,再转为子类。
使用loadFromNib方法,从xib中加载UIView,
protocol NibLoadable {
}
extension NibLoadable where Self : UIView {
static func loadFromNib(_ nibname : String? = nil) -> Self {
let loadName = nibname == nil ? "\(self)" : nibname!
return Bundle.main.loadNibNamed(loadName, owner: nil, options: nil)?.first as! Self
}
}
一般会使用where Self对可遵守协议的类型进行限制。此处UIView要求的子类才可遵守该协议,并且可以直接使用UIView相关的属性和方法。
|