• swift 笔记 (十九) —— 协议


    协议(Protocols)

    协议仅是用定义某些任务或者是功能必须的方法和属性。

    类似于java里的interface的作用。但协议并不会实现详细的功能。


    我猜这个名字源于OO中提到的“契约”。但我并不认为这名字非常好,反而是interface这名字更容被接受。由于我认为协议这个名字非常easy和网络编程的时候的网络协议搞混,网络协议也通常简称为协议。

    语法:
    protocol MyProtocol {
         //协议定义
    }

    struct MyStruct: MyProtocol1, MyProtocol2 {
         …...
    }

    class MyClass: MyBaseClass, MyProtocol {
         …...
    }

    协议写得与继承没有什么区分,所以这种话。我们是不是就须要把协议的名字专门加上xxxxProtocol以区分究竟是继承还是协议,以便让别人一眼就看明确。

    。。。。

    唉,无奈的语法


    protocol MyClassProtocol {
        class var num:Int {get}    //get表示仅仅读属性
    }

    struct MyStruct : MyClassProtocol {     //编译器会提示
                                           //Type’MyStruct’ does not 
                                           //conform to protocol ‘MyClassProtocol'
       
    }

    协议中写了class。说明num是一个类成员,所以不能用在struct上,假设要用在struct中的话,要写为static,这一点,与前面说的类属性和结构体属性一章的内容一致。


    可是非常有趣的一点是,对于protocol来说,他本该是一条严格的规则。全部的条目必须满足它的规定,然而,并不尽然。比如上面的{get},这样并没写set方法的话,意思为仅仅读,可是,我们依旧能够在类的实现中写出set方法(必须提供get)。可是假设不定义num的实现就不行。所以protocol并不严格。我们就仅仅把它理解为“至少满足”的条件好了。

    方法的定义事实上也一样:
    protocol MyProtocol {
         class func myMethod()          //类方法
    }

    protocol MyProtocol {
         func myMethod() -> Int          //实例方法
    }

    protocol MyMutating {
         mutating func myMethod()     //突变方法(结构体,枚举)
    }

    协议类型
    如今除了基本类型,枚举。结构体,类,我们又多了一种类型。协议。

    协议能够作为函数的參数。返回值。常量。变量等等。。。

    protocol MyClassProtocol {
        
    var num:Int {get}
    }

    class MyClass1:MyClassProtocol {
        
    var num:Int = 1
        
    var name = "class1"
    }

    class MyClass2 :MyClassProtocol {
        
    var num:Int = 2
        
    var typeName = "MyClass2"
    }

    class MyTestClass {
        
    var handle:MyClassProtocol     //作为变量类型
        
        
    init(handle:MyClassProtocol){     //作为函数參数
            
    self.handle = handle
        }
    }

    var c1 = MyClass1()
    var c2 = MyClass2()

    var t1 = MyTestClass(handle: c1)
    var t2 = MyTestClass(handle: c2)

    在这个样例中,能够看出,handle更像是一个多态的应用,他能够接受不论什么一个满足MyClassProtocol协议的实例作为变量值。


    代理
    事实上如今还用了非常多设计模式,都没有被拿出来说,然而这个模式却要拿出来强调。或许是和苹果的UI设计架构有非常大关系。
    事实上这块就是在讲,swift希望我们怎样来实现多态。不多说了。

    协议继承
    这个跟类继承非常像:
    protocol MyProtocol: MyProtocol1, MyProtocol2{

    }

    协议组合
    假设我们须要让參数的类型同一时候支持非常多个协议的话。我们就能够用协议的组合。能够通过protocol<MyProtocol1, MyProtocol2>的形式来完毕协议的组合.

    官方的样例:



    协议一致性检查
    在之前笔记中,我们使用 is 和 as 对类的实例类型进行检查和转换,如今我们也能够用这两个操作符对协议进行操作。所以,不须要再反复的举例了。
    (事实上本质上与类中的操作无不论什么差别。由于协议无非就是类定义的一种特殊形式罢了。非要说结构体的话,那么它也是结构体定义的一种特殊形式,以及枚举。)

    可选协议
    @objc protocol MyProtocol {          //@objc 说明这协议是可选的
         @optional func myFunc()         //@optional 指出这种方法是可选的
         @optional var myNum:Int {get}   //          指出这个变量是可选的
    }

    可选我们已经说过太多了,仅仅要知道这个就能够了,也不用举例了。


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    ArcGIS案例学习笔记4_2
    ArcGIS案例学习笔记4_1
    ArcGIS案例学习笔记3_2
    ArcGIS案例学习笔记1_1
    ArcGIS案例学习1_2
    ArcGIS案例学习笔记2_1
    Window环境下配置Redis服务的方法及查看缓存数据的工具介绍
    C# 递归程序 获取某个节点下的全部子节点
    SQL查询中的in与join效率比较
    解决路由问题造成客户端无法访问服务器的方法之瞒天过海
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4648926.html
Copyright © 2020-2023  润新知