前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Swift3.0 - 协议protocol

Swift3.0 - 协议protocol

作者头像
酷走天涯
发布2018-09-14 14:55:32
4680
发布2018-09-14 14:55:32
举报
文章被收录于专栏:每日一篇技术文章
学习目标
  • swift中的协议和OC 中协议的区别
  • swift中的协议的用法
  • 怎么使用
swift和Object-C 协议的区别

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


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

注意方法不能重写

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

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

示例代码:

代码语言:javascript
复制
@objc protocol OptionalProtocol{
 @objc optional func optionalMethod()
 @objc optional var name:String {set get}
}

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

示例代码:

代码语言:javascript
复制
public protocol SCNSceneRendererDelegate : NSObjectProtocol {
    optional public func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval)
}
你应该注意的
  • 在协议中定义属性的时候,必须使用set get \ get\ 修饰,但不能只用set修饰,swift要求我们属性必须有get方法
  • 类不能多次继承同一个协议
代码语言:javascript
复制
 class Student:Love,Love{
    internal var name: String
    internal func modifyMusic(name: String) {
    }
}
  • 如果多个协议中有相同的方法和属性,只需要实现一次即可
代码语言:javascript
复制
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) {
  }
}
一般人不知道
  • 需求:创建一个协议只能被类遵守
代码语言:javascript
复制
 protocol MyClassDelegate: class{
    func getName()
 }

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

当你要使用weak 修饰的时候

代码语言:javascript
复制
class UDP{
    weak var delegate: UDPDelegate?
}
protocol UDPDelegate:class{
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016.10.07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 学习目标
  • swift和Object-C 协议的区别
  • Swift协议(protocol)
  • 你应该注意的
  • 一般人不知道
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档