美文网首页
OC和Swift中的protocol

OC和Swift中的protocol

作者: 六横六竖亚 | 来源:发表于2019-06-21 13:50 被阅读0次

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

相关文章

网友评论

      本文标题:OC和Swift中的protocol

      本文链接:https://www.haomeiwen.com/subject/jncsqctx.html