swift 笔记 (十九) —— 协议

协议(Protocols)

协议仅是用定义某些任务或者是功能必须的方法和属性。类似于java里的interface的作用。但协议并不会实现具体的功能。

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

语法:
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}   //          指出这个变量是可选的
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值