Swift3.0 - 协议protocol

学习目标

  • swift中的协议和OC 中协议的区别
  • swift中的协议的用法
  • 怎么使用

swift和Object-C 协议的区别

1.OC 中的协议只能用于类,swift中的协议不仅能用于类,还能用于结构体和枚举 2.OC 中的协议可以设置可选实现,但Swift中的协议必须实现 3.Swift中的协议增加了一个关键字mutating可以决定结构体和枚举实现协议的时候,是否可以修改属性的值


Swift协议(protocol)

  • 定义一个协议
protocol LoveMusic{
    func songMusic()
    var  simpleDescription: String { get }
    mutating func modifyMusic(name:String)
}
  • 协议可以继承协议(多个)
protocol LoveMusic:Love,Skill{
    func songMusic()
    var  simpleDescription: String { get }
    mutating func modifyMusic(name:String)
}
  • 协议的重写
protocol Love{
    var name:String{get set} 
}
 // 我们重写协议中的属性,让其只要get方法即可
protocol LoveMusic:Love{
    func songMusic()
    var  simpleDescription: String { get }
    mutating func modifyMusic(name:String)
}

注意方法不能重写

  • 可以实现多个协议
class Student:Love,Skill{
internal var name: String = ""
internal func modifyMusic(name: String) {
}
}
  • 协议类型的变量
// 协议的 标准写法
var prptocol:ProtocolA
var delegate:ProtocolA & ProtocolB & ProtocolC
  • 协议做函数参数
    func getStudent(student: ProtocolA & ProtocolB){
        student.dreak()
        student.eat()
  }
  • 实现协议可选函数或者变量

  1. 在协议的前面加上关键字 @objc ,再在你需要设置可选方法或者属性的前面加上关键字@objc 和 optional 即可

示例代码:

@objc protocol OptionalProtocol{
 @objc optional func optionalMethod()
 @objc optional var name:String {set get}
}

2.还有另外一种方法可以实现可选协议就是遵守NSObjectProtocol

示例代码:

public protocol SCNSceneRendererDelegate : NSObjectProtocol {
    optional public func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval)
}

你应该注意的

  • 在协议中定义属性的时候,必须使用set get \ get\ 修饰,但不能只用set修饰,swift要求我们属性必须有get方法
  • 类不能多次继承同一个协议
 class Student:Love,Love{
    internal var name: String
    internal func modifyMusic(name: String) {
    }
}
  • 如果多个协议中有相同的方法和属性,只需要实现一次即可
protocol Love{
    var name:String{get set}
    mutating func modifyMusic(name:String)
}
protocol Skill{
    var name:String{get set}
    mutating func modifyMusic(name:String)
}
class Student:Love,Skill{
    internal var name: String = ""
    internal func modifyMusic(name: String) {
  }
}

一般人不知道

  • 需求:创建一个协议只能被类遵守
 protocol MyClassDelegate: class{
    func getName()
 }

什么时候必须使用类协议?

当你要使用weak 修饰的时候

class UDP{
    weak var delegate: UDPDelegate?
}
protocol UDPDelegate:class{
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云霄雨霁

设计模式----状态模式

16200
来自专栏Java大联盟

Java面试手册:核心基础-3

2.数组有没有length()这个方法? String有没有length()这个方法?

19130
来自专栏java学习

Java每日一练(2017/7/7)

1 (单选题)有以下程序片段,下列哪个选项不能插入到行 1 。()。 1. 2.public class A{ 3.//do sth 4. } A publ...

390110
来自专栏linux运维学习

linux学习第六十四篇:Shell脚本中的逻辑判断,文件目录属性判断, if特殊用法,case判断

Shell脚本中的逻辑判断 格式1:if 条件 ; then 语句; fi 格式2:if 条件; then 语句; else 语句; fi 格式3:if …; ...

32860
来自专栏coding

redis列表list类型详解

63520
来自专栏IT技术精选文摘

阿里架构师带你深入浅出jvm

27320
来自专栏Android开发指南

7:多线程

30780
来自专栏Python研发

Memcached·Redis缓存的基本操作

Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、...

17540
来自专栏mukekeheart的iOS之旅

Java基础——异常体系

在Java中,异常对象都是派生于Throwable类的一个实例,Java的异常体系如下图所示: ?    所有的异常都是由Throwable继承而来,在下一层立...

28470
来自专栏Java 源码分析

Java 虚拟机运行时数据区

运行时数据区: Java 虚拟机的运行时数据区按照大的可以分为线程独立使用的数据区,和所有线程共享的数据区。 一.线程独立使用数据区 1.程序计数器 程序计数器...

27550

扫码关注云+社区

领取腾讯云代金券