OC和Swift中的protocol

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 {}  //实现协议中的方法


非正式协议

Category & Extension

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。