本文主要是介绍Swift3.0 - 协议protocol,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Swift3.0 - 真的很简单
Swift3.0 - 数据类型
Swift3.0 - Array
Swift3.0 - 字典
Swift3.0 - 可选值
Swift3.0 - 集合
Swift3.0 - 流控制
Swift3.0 - 对象和类
Swift3.0 - 属性
Swift3.0 - 函数和闭包
Swift3.0 - 初始化和释放
Swift3.0 - 协议protocol
Swift3.0 - 类和结构体的区别
Swift3.0 - 枚举
Swift3.0 - 扩展
Swift3.0 - 下标
Swift3.0 - 泛型
Swift3.0 - 异常错误
Swift3.0 - 断言
Swift3.0 - 自动引用计数(strong,weak,unowned)
Swift3.0 - 检测API
Swift3.0 - 对象的标识
Swift3.0 - 注释
Swift3.0 - 元类型
Swift3.0 - 空间命名
Swift3.0 - 对象判等
Swift3.0 - 探究Self的用途
Swift3.0 - 类簇
Swift3.0 - 动态调用对象(实例)方法
Swift3.0 - 文本输出
Swift3.0 - 黑魔法swizzle
Swift3.0 - 镜像
Swift3.0 - 遇到的坑
学习目标
- 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()}
- 实现协议可选函数或者变量
- 在协议的前面加上关键字 @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: Stringinternal 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{
}
这篇关于Swift3.0 - 协议protocol的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!