swift协议使用整理

本文深入解析Swift中的协议(Protocol)概念,包括其定义、用途及如何被类、结构体和枚举实现。通过具体示例,如创建教师和学生类,展示协议的实际应用,并解释mutating关键字的作用以及Objective-C兼容性关键字@objc的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义

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关键词修饰


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值