定义
Protocol(协议)
用于统一方法和属性的名称,而不实现任何功能。协议
能够被类,枚举,结构体实现,满足协议要求的类,枚举,结构体被称为协议的实现者
。
实现者
需要提供协议指定的成员,如属性,方法,操作符,下标等。
简单使用
1、 声明
public protocol HumanProtocol {
var name:String{get set}
var age:Int {get set}
var weight:Int {get set}
func eat();
func run();
func speak(_ string:String)
}
2、 使用
以一个老师带10个学生为例
Tearcher类
class Teacher: NSObject, HumanProtocol {
private var studentArray: Array<student> = Array<student>.init()
var name: String = ""
var age: Int = 0
var weight: Int = 0
func eat() {
print("吃红烧肉")
}
func run() {
print("跑 2000米")
}
func speak(_ string: String) {
print("我是老师")
print("姓名:\(name)\t 年龄:\(age)\t 体重:\(weight)")
print("\(string)")
}
public init(name: String, age: Int, weight: Int) {
super.init()
self.name = name
self.age = age
self.weight = weight
}
public func addStudent(stu: student) {
studentArray.append(stu)
}
public func logAllStudentInfo() {
speak("我是老师,下面是我带的学生的信息")
studentArray.forEach {
$0.speak("请大家多多关照")
}
}
}
学生类的实现
class student: NSObject,HumanProtocol {
var name: String = ""
var age: Int = 0
var weight: Int = 0
func eat() {
print("吃 ------青菜------")
}
func run() {
print("跑了 100米")
}
func speak(_ string: String) {
print("我是学生")
print("姓名:\(name)\t 年龄:\(age)\t 体重:\(weight)")
print(string)
}
public init(name:String,age:Int,weight:Int){
super.init();
self.name = name
self.age = age;
self.weight = weight;
}
}
3、 调用
let ts:Teacher = Teacher.init(name: "李晓军", age: 30, weight: 120)
for i in 1...10 {
let st:student = student.init(name: "学生"+"\(i)", age: 18, weight: 100)
ts.addStudent(stu: st)
}
ts.logAllStudentInfo()
mutating关键词
Swift 的 protocol 不仅可以被 class 类型实现,也适用于 struct 和 enum。因为这个原因,我们在写给别人用的协议时需要多考虑是否使用 mutating 来修饰方法,比如定义为 mutating func myMethod()。Swift 的 mutating 关键字修饰方法是为了能在该方法中修改 struct 或是 enum 的变量,所以如果你没在协议方法里写 mutating 的话,别人如果用 struct 或者 enum 来实现这个协议的话,就不能在方法里改变自己的变量。
如下例子:
protocol Togglable {
mutating func toggle()
}
enum OnOffSwitch: Togglable {
case Off, On
mutating func toggle() {
switch self {
case Off:
self = On
case On:
self = Off
}
}
}
var lightSwitch = OnOffSwitch.Off
lightSwitch.toggle()
不管是objective-c
还是swift
都是不能随意修改 self
的值;但是在swift中struct和enum实现了协议方法后使用可能改变self
的值,为了解决这种问题而引进 mutating
关键字
Objec关键字
swift 中prototol
声明的协议方法默认都是必须要实现的(swift中没有可选实现的协议方法一说),但为了兼容objective-c
的协议规则添加了objec
关键字
当某个协议被 @Objec
修饰之后则表明这个协议是符成objective-c协议规范的。则:
* 该协议不能被 struct
和 enume
实现
* 可以使用 @option
和 @require
关键词修饰
作者:
