美文网首页
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