OC和SwiftProtocol的共同点
本质都是抽取不同类的共同方法和属性(声明),供遵循协议的类或对象使用。
都可以通过定义协议实例deleagate,来实现委托代理模式。
PS:类比继承的概念,继承父类的方式比较险隘,子类和父类只能为同一基类,且方法都有实现,需在子类中override,并不能把方法和属性完全独立出来,且不能多继承。
OC和SwiftProtocol的区别(核心)
OC中的协议更单纯的受限于委托代理的含义,多用于跨类的传值和回调通知。
而Swift是面向协议编程,其思想是通过抽取不同类中的相同方法和属性,实现模块化减少耦合。
Swift可以通过协议extension扩展,缺省实现协议的方法(OC不行)。
Swift的协议不需要单独声明协议对象(id <Deleagate> delegate)和指定代理(delegate = self),只需要遵循协议的类实现声明,或使用协议的缺省实现。
Swift中protocol的使用
协议的属性要求:只能是计算属性。指定其读写性{ get set };var关键字修饰;可用static关键字实现类属性;不能设置默认值(默认值被看做是一种实现)。
协议的方法要求:方法不能添加默认实现和默认参数(可使用扩展实现);可用static关键字实现类方法;mutating修饰,方法实现时,满足结构体或枚举内部修改属性变量的情况。
协议可以作为类型使用;可看做一种特殊泛型。
在协议后加class(或anyobject),标识只能被类类型遵守struct不行。
在协议前加@objc,表示只能被OC或@objc的类遵循。
Swift中协议的方法其实没有可选实现,加@objc optional是为了对应OC中的optional。
protocol YwProtocol {
var identifier: String { get }
func myMethod()
}
// 缺省实现扩展,代替optional(OC中的@optional)
extension YwProtocol {
var index: Int?
mutating func myMethod() {
index = 0 // mutating关键字的用法
print("默认实现")
}
}
struct YwStruct: YwProtocol {
func myMethod() {
print("实际实现")
}
}
//协议的多继承
protocol YwChildProtocol: YwProtocol & YwAnotherProtocol {
var newPara: String { get }
func newMethod()
}//指定可遵循此协议的类
extension YwProtocol where Self : YwStruct {
func myMethod() {
print("指定实现")
}
}
OC中protocol的使用
由协议(@Protocol)、代理对象(id delegate)和委托者(<delegate>)三部分组成。
定义一套公用的接口,供代理对象使用
声明协议
@protocol TestDelegate <NSObject, OtherDelegate> //协议可多继承
@required //必须实现的方法(默认)
@option //可选实现的方法
- (void) test; //定义一个方法
@end
代理对象,使用weak修饰,防止委托者被受委托者持有造成循环引用、内存泄露。
@property (nonatomic, weak) id <TestDelegate> delegate;
委托者
@interface YwClass ()<TestDelegate> //服从协议
YwClass().delegate = self; //指定代理对象
- (void) test {} //实现协议中的方法