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: 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{
}