swift协议使用整理

定义

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协议规范的。则:
* 该协议不能被 structenume 实现
* 可以使用 @option@require关键词修饰


作者:         声明:转发本文,请联系作者授权

你可能感兴趣的:(swift)