swift协议使用整理

Swift 面试题及答案整理,最新面试题 在Swift中,类的继承关系和协议的实现提供了运行时多态性,使得同一接口可以有多个实现,具体使用哪个实现在运行时通过动态派发来决定。这些函数接受一或多个函数作为输入,并返回一个新的集合,使得你可以用更少、更清晰的代码来执行复杂的操作。通过使用协议,你可以定义一组应该由特定类型实现的相关方法和属性,从而实现接口的抽象和多态性。来调用抛出错误的函数,分别表示:检查错误并使用do-catch处理、将结果转换为可选值(如果发生错误则结果为nil)、断言调用不会抛出错误(如果实际抛出错误,则会触发运行时错误)。 阅读详情

定义

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


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

iOS开发-Swift进阶之协议Protocol! swift进阶总汇 本文主要分析protocol的用法及底层存储结构 协议的基本用法 【语法格式】:协议的语法格式 //协议的语法格式 protocol MyProtocol { //body } class、struct、enum都可以遵守协议,如果需要遵守多个协议,可以使用逗号分隔 //1-2、class、struct、enum都可以遵守协议,如果需要遵守多个协议,可以使用逗号分隔 struct CJLTeacher: Protocol1, Protocol2 { //b. 阅读详情

相关推荐

swift 常用关键字整理

·typealias 类型别名,为已存在类型定义可选的名字 extension 扩展 protocol 协议 enum 枚举 struct 结构体(值类型 不能继承) class 类(引用类型) @escaping 逃逸闭包(闭包调用在作用域外) @autoclosure() 自动闭包 convenience 便捷初始化 override 重写了父类 final 阻止子类重写方法和属性 associatedtype 协议实现泛型,使用关联类型 mutating 结构体和枚举中 ..

flg1554112450的博客 710

Swift之协议

前言如果你之前使用objective-c编写iOS程序肯定对协议都不陌生,在Swift中苹果将protocol这种语法发扬的更加深入和彻底。Swift中的protocol不仅能定义方法还能定义属性,配合extension扩展的使用还能提供一些方法的默认实现,而且不仅类可以遵循协议,现在的枚举和结构体也能遵循协议了。协议中定义范型,属性,方法 协议的定义 协议为方法,属性,以及其他特性的任务需求或功

iiiiiiiiiihero的专栏 3189

Swift-NSPredicate学习整理

Swift-NSPredicate学习整理

weixin_35755389的博客 1033

万字长文详解如何使用Swift提高代码质量 | 京东云技术团队

京喜APP最早在2019年引入了Swift,使用Swift完成了第一个订单模块的开发。之后一年多我们持续在团队/公司内部推广和普及Swift,目前Swift已经支撑了70%+以上的业务。通过使用Swift提高了团队内同学的开发效率,同时也带来了质量的提升,目前来自Swift的Crash的占比不到1%。在这过程中不断的学习/实践,团队内的Code Review,也对如何使用Swift来提高代码质量有更深的理解。

JDDTechTalk的博客 1092

在Xcode中优雅地整理我们的Swift代码

除了在Xcode中使用分组和分割线来组织代码,你还可以使用文件和目录结构来更好地组织代码。Swift中的扩展是一种强大的工具,可以将相关的代码组织在一起,而不必修改原始类的代码。通过将代码分散到多个扩展中,你可以更好地组织和管理代码。通过将相关功能定义在协议中,并使用协议扩展来提供默认实现,你可以将代码分离到多个协议和扩展中,使其更具可读性和可维护性。例如,你可以创建一个名为"Models"的目录,将所有的模型类放在其中,创建一个名为"Network"的目录,将所有的网络请求和API管理器放在其中。

BitNetO的博客 276

在 XCode 中优雅地整理我们的 Swift 代码

大多数 iOS 团队都很难整理他们的代码。这是因为一些团队成员可能没有遵循 Swift 代码约定或使用他们自己的代码风格(尤其是初级工程师),因为他们往往会忘记或不知道 Swift 的代码约定。不骗你,当我刚接触 Swift 编程时,我就是那些初级工程师中的一员。但我发现了 XCode 提供的一些技巧,这些技巧让我的生活更轻松。当然,我不需要经常整理我的代码,因为我已经在强迫自己遵循 Swift 或我团队的代码约定。但这些技巧在常见情况下可能对我们有所帮助。

iCloudEnd的博客 1257

【编程语言】Swift使用教程

Swift是一种由苹果公司开发的现代编程语言,它结合了C和Objective-C的优点,同时添加了很多新的特性来简化编程过程。Swift旨在让编写更安全、更快速的代码变得更加简单。下面是一个基础的Swift使用教程,介绍了一些基本概念和用法。

大雨淅淅的博客 2304

【嵌入式底层知识修炼】按键和LED共用IO口的分时复用扫描方法

文章目录01 - PCB原理图例程02 - 分时复用的注意项和设计2.1 - 注意项2.2 - 设计03 - 代码实现 只要我跑的速度够快,寂寞就追不上我 只要Key和Led切换速度够快,人眼就看不出来 ————小白   如果你存在按键Key和显示Led共用同一个IO时,需要分时复用的需求,则可以移植代码进行使用: 代码所占code少于0.5K 线程安全,中断安全 可移植性高,配置容易 注意:系统需要存在一个至少为1ms的时钟中断 01 - PCB原理图例程   举2个Key和Led共用IO口的

单眼皮根号三的博客 1万+

翻译:protocol的高阶用法,在Swift 5中使用协议protocol构建自定义集合Collection

说明 Array,Dictionary并且Set是Swift标准库中捆绑的常用集合类型。但是,如果他们没有立即提供您的应用所需的一切,该怎么办?别担心。您可以使用Swift标准库中的协议创建自己的自定义集合! Swift中的集合带有大量方便的实用程序,可用于遍历它们,对其进行过滤等。除了使用自定义集合之外,您还可以将所有业务逻辑添加到自己的代码中。但是,这会使您的代码肿,难以维护并且无法复制标准库提供的内容。 幸运的是,Swift提供了功能强大的收集协议,因此您可以创建自己的收集类型,这些收集类型专门为满足

AI架构师易筋 1129

长短期记忆网络(LSTM)预测模型及其Python和MATLAB实现

LSTM 通过独特的门控机制解决了传统 RNN 的梯度消失和梯度爆炸问题,使其在处理长序列时具有显著优势。随着技术的不断发展,LSTM 及其变种(如 Bi-directional LSTM、Stacked LSTM 等)有望在更复杂的任务中发挥重要作用。2. **可视化真实值和预测值**:通过绘图来比较真实值和预测值,判断模型的准确性。2. **输入门(Input gate)**:决定当前的输入信息对细胞状态的影响。1. **细胞状态(Cell state)**:保持信息在时间步之间的传递。

qq_45441438的博客 2055

投入产出表之直接消耗系数和完全消耗系数计算--基于Excel

介绍 上篇博客已介绍投入产出表的结构类型及意义解读,在此就不重复写了。 投入产出法中相对稳定的因素是一些系数,根据投入产出表可以计算很多系数: 案例 案例数据即流量矩阵,采用的是中国2012年的部分行业数据,若有不对,请批评指正哈。 直接消耗系数的计算 根据上表和直接消耗系数的计算公式,直接消耗系数矩阵通常用A表示。农林牧渔产品和服务部门对其他部门产品的直接消耗系数分别为: 这些消耗系数的经济意义是,农、林、牧、渔产品和服务部门每生产单位(1亿元)总产出,要直接消耗0.1378亿元本部门产品,0.26

m0_46271335的博客 7万+

Swift 协议

协议定义了一个蓝图,规定了用来实现某一个特定任务或者功能的方法、属性,以及其他需要的东西。类、结构体或枚举都可以遵循协议,并为协议定义的这些要求提供具体实现。某个类型能够满足某个协议的要求,就可以说该类型遵循这个协议。除了遵循协议的类型必须实现的要求外,还可以对协议进行扩展,通过扩展来实现一部分要求或者实现一些附加功能,这样遵循协议的类型就能够使用这些功能。

xiaoxiaobukuang的专栏 1548

深度剖析XY2-100与SL2-100协议:解锁激光打标核心技术密码

XY2-100和SL2-100是激光打标领域的两种核心控制协议。XY2-100协议采用串行通信,指令集简单,适合常规打标任务,具有成本优势;SL2-100协议支持更高速率(1Mbps以上),具备曲线插补等高级指令,在精密加工领域表现突出。两者的主要差异体现在数据传输(帧结构、速率)、指令集(功能、数量)、参数调节(范围、精度)和错误处理机制等方面。实际应用中,XY2-100适合简单图形的大批量生产,SL2-100更胜任复杂曲面的高精度加工。选择时需综合考虑打标需求、设备兼容性和成本因素,未来两种协议将持续优

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 957

Ice:macOS 菜单栏管理完整指南,三步搞定隐藏、重排与美化

Ice 是一款开源的 macOS 菜单栏管理工具。它可以隐藏不常用的图标、拖拽重排图标,并支持自定义菜单栏颜色与形状。工具适合菜单栏拥挤或受刘海屏限制、希望整理顶部空间的 Mac 用户,解决的是图标占位有限、视觉杂乱的问题。 ## 它是什么:一个 Swift 写的菜单栏收纳工具 Ice 是 macOS 平台的菜单栏管理工具,使用 Swift 原生开发,采用 GPL-3.0 协议开源。最低系统要

gitblog_00998的博客 357

pymol 动画简单制作,gif、mp4导出

参考: https://www.youtube.com/watch?v=G77K9Lro8js1、直接Movie下Program下,Camera Loop下Nutate下选择,这里选择30degover4 sec;如果要动画过渡自然,可以在这4sec后面再Append 1sec;如果需要两个视角,既可以再把窗口蛋白定位到比如配体,不用管中间过程怎么定位过去配体,再Program下,Camera Loop下Nutate下选择,这里选择30degover4 sec添加;最后如果要整体形成个循环播放,可以在这4s

weixin_42357472的博客 8435

手把手教你学simulink(28.2)--四旋翼无人机景示例:基于自抗扰控制(ADRC)的无人机姿态稳定系统

通过上述代码实现,您可以逐步创建和搭建一个基于自抗扰控制的无人机姿态稳定系统。该系统能够实时估计和补偿外部扰动及模型不确定性,确保无人机姿态稳定。自抗扰控制具有较强的鲁棒性和适应性,能够在存在不确定性和扰动的情况下提供快速且精确的控制性能。Simulink提供了强大的建模和仿真工具,使得控制系统工程师能够快速构建复杂的控制算法,并将其应用于实际工程中。无人机动力学建模:建立无人机的六自由度(6-DOF)动力学模型,包括位置、速度、姿态角和角速度。自抗扰控制器设计。

MHD0815的博客 499

swift 2.0 协议 必须实现 和 可选实现

// 3.Protocol // 默认是必须实现的方法 protocol KeepBadyProtocol{     func clean()      } //一般 : 后面第一个跟父类名,如果没有父类,后面跟的就是协议名,如果有多个协议,用 ','隔开即可 class BadyKeeperKeeper : KeepBadyProt

bellazhouyi的专栏 2775

【Claude】Not logged in · Please run /login 报错已解决

意味着 Claude Code 没有找到任何有效凭证。直接/login——交互式首选;检查——排查环境变量污染;CI 用——自动化场景标准方案;macOS Keychain 异常——/logout/login重置;时钟偏差——校准系统时间。参考:Claude Code 官方《错误参考》"身份验证"章节、官方认证优先级文档、社区 Token 过期排查记录。

博客 9976

Swift 常用的第三方框架整理

最近整理了一下Swift项目中常用的Swift框架

iOS__feng的博客 2579

Flutter:如何在Android中实现串口通信调试

本文介绍如何通过flutter_libserialport插件在Flutter中实现串口通信调试。

sg_knight的专栏 6098

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ios_swift开发资源整理

iOS Swift开发资源整理 文档管理者:PMST 当前版本:V1.1.0 最后更新日期:2015.06.28(ps:这兴起事情有点多更新有点少) 注:[New]表示更新内容,此外有优秀文章、资源、框架等等,都可以推荐给我,发送到我的邮箱。 邮箱地址链接:mcxcode@163.com 更新周期: 已暂停更新 目录 1.苹果官方资源 2.国内外视频网站推荐 3.中

Meadows of Heaven 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Swift 面向协议编程的那些事

一直想写一些 Swift 的东西,却不知道从何写起。因为想写的东西太多,然后所有的东西都混杂在一起,导致什么都写不出来。翻了翻以前在组内分享的一些东西,想想把这些内容整理下,写进博客吧。我对计划要写的东西做了个清单(最近做什么都喜欢在前一天睡觉前做个清单,这样多少改善了我的拖延症

weixin_33762321的博客 149

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Swift学习之路 -- 协议、扩展和泛型

本文学习自《 The Swift Programming Language-swift2.0官方手册 中文版》的电子版 是记录自己的Swift学习历程、整理相关资料便于查看协议和扩展使用protocol来声明一个协议protocol ExampleProtocol { var simpleDescription :String { get } mutating func adjus

Bubble_H的博客 945

如何使用iOS原生语言编写Swift类?

互用性(互操作性)使开发者可以定义融合了 Objective-C 语言特性的Swift类。编写 Swift 类时,不仅可以继承 Objective-C 语言编写的父类,采用 Objective-C 的协议,还可以利用 Objective-C 的一些其它功能。这意味着,开发者可以基于 Objective-C 中已有的熟悉、可靠的类、方法和框架来创建 Swift 类,并结合 Swift 提供的现代化和更有效的语言特点对其进行优化。 继承Objective-C的类 在 Swift 中,开发者可以定义一个子类,该

iOS-大鑫 288

【iOS】swift关键字整理及含义

以“#”开头关键字 字面量 类型 含义 #file String 所在的文件 #function String 所在的方法 #line Int 所在的行 #column Int 所在的列 #if * * #else#elseif * * #endif * * #available * * #selector * * 用在模式中的关键字 ..

super_man_ww的博客 455

[Swift]实际编程过程中的技巧整理(待更新)

1.Swift中,将Byte类型转化成char类型 例: let b:Byte = 97 println(Character(UnicodeScalar(Int(b)))) 当然可以扩展Byte类 extension Byte { func char() -> Character { return Character(UnicodeScalar(In

欲买桂花同载酒,终不似,少年游。 1555
上一篇: 使用 SDWebImage pod install 因为 libwebp 初始化不成功问题处理
下一篇: Swift中 "..." 和 ".." 以及 "=="与"==="
Philm_iOS
博客等级 码龄8年 74粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值