Swift的闭包,枚举,类和结构体

7、Swift 编程:函数、闭包、类、结构体与枚举的深入探索 本文深入探讨了 Swift 编程中的函数、闭包、类、结构体和枚举等核心概念。通过详细的代码示例,展示了如何创建和使用函数、闭包以及它们的优化技巧;同时介绍了类、结构体和枚举的定义和使用场景,帮助开发者更好地组织和管理代码,提高开发效率。 阅读详情

闭包(Closures)


使用过其他语言的应该对代码块并不陌生,Swift中的闭包与C,OC中的Block相似。
表示自包含的函数代码块,可以在代码中传递和使用。
并且可以捕获和存储上下文的变量以及常量值,Swift会为你进行捕获相关的内存操作。


上一篇文章提到的函数,也是一种特殊的闭包,具体在:
全局函数是有名字但是不会捕获任何值的闭包。
嵌套函数是有名字且可以捕获域内值的闭包。
闭包表达式是利用轻量级语法写的可以捕获上下文值的匿名闭包。

基本语法

表达式的一般语法以及简化过程


上面罗列了同一个行为的五种写法,也标明了简化方法适用的情景。

尾随闭包


上面那个闭包若使用尾随闭包的方式来写,则表现为:
reversed = sort(names) {$0 > $1}

通常我们会把具有多行的闭包表达式写入尾随闭包。
例如Array的map方法可以对数组内的每一个元素调用一次闭包,返回一个新的数组。


这里捕获了numbers数组中的每个值并将output映射到一个新的strings数组中。


值捕获


闭包可以在其上下文捕获一些值,即使原域已经不存在。上面提到嵌套函数是有名字可以捕获域内值的闭包。Swift中最简单的闭包形式即是嵌套函数。


这里定义了一个嵌套函数makeIncrementor,里面记录了一个变量runningTotal,嵌套在里面的函数可以捕获这个值并将其持有保留住。


但是如果新声明了一个相同函数的变量/常量引用,则其runningTotal并不共享



闭包是引用类型,上面声明的常量是指向闭包内容的一个引用,而并非闭包内容本身。


枚举


Swift的枚举十分灵活,case中的值可以是字符串,字符,整型或者浮点型。并且可以指定任何类型的相关值存储到枚举成员中。
在Swift里,枚举是一等类型(first-class),它支持类所支持的特性(除了继承),你可以为它定义一些函数让其富有行为等等。

基本语法



当我们已经确定了其是CompassPoint的时候,可以直接使用.Value省略枚举名的形式赋值。

switch匹配


相关值

前面提到过,我们可以为其指定任意类型的相关值存储到枚举成员中。
来看下面这个例子


我们给BarCode枚举存储了一些相应case的相关值,并且可以利用绑定值的方式去访问它,如在switch中定义了个常量identifier来获取Barcode中QRCode的相关值。

原始值

在Swift中,枚举并不会像c,objective-c中的枚举在你未声明枚举值的情况下隐式的赋值0,1,2...只有我们给其赋值时才会猜测其值,但是也仅限于Int。
Swift为其定义了方法来访问原始值toRaw()或者通过fromRaw(value)访问其枚举成员。


由于我们的枚举中并没有5对应的成员,所以其为nil。但如果换为3,则是Green。

那如果枚举成员是String呢?会不会也会猜测值?当然是不太可能了- -
编译器会报错


非integer必须要给其赋值才可以。


类与结构体


定义,实例声明与属性




由于这里并没有设置自定义的指定构造器,所以可以直接使用默认的方式()来初始化一个实例。

访问设置属性则使用点语法,不过与Ojbective--C不同的是,Swift允许对结构体的子属性直接赋值。另外一个不同则是Swift类不需要.h接口文件。


在OC中我们想修改Rect.Origin的x值经常需要赋一个新的origin给rect,而Swift中则可以直接修改了。

在Swift中结构体,枚举和类都可以通过写一些成员函数来为其添加行为。
构造时则稍有不同,结构体可以为其提供逐一成员构造器。


这是系统自动提供的,而类则没有提供。

值类型和引用类型


结构体,枚举和类另外主要不同的一点是类型。
结构体和枚举为值类型,类则是引用类型。

值类型指在赋值传递的时候,系统会自动为其拷贝一个新值并传递给新声明的变量或常量。


我们注意在将hd赋值给cinema后立即cinema的width进行了修改,但是再访问hd.width还是原来的值1920.说明只是将hd的拷贝赋给了cinema而并不是hd本身。

引用类型这是将新的变量或常量指向了原来的对象,而并非拷贝对象值之后进行赋值。


这里修改了frameRate,再访问原来变量的frameRate发现也发生了变化。原因在于他们都指向了同一块堆内存。


在Swift中,判定引用相等引人了一个恒等符号"===",来判定是否引用同一实例,不引用同一实例则为"!=="(不等价于)
那么"==="和"=="的不同在于哪里呢?
等价于("===")表示两个类类型的常量或变量引用同一个实例。
而"=="表示两个实例的值是否相等,判定需要遵照类设计者定义的判定标准。

由于结构体是值类型,我们不使用等价于进行判断。


类和结构体的异同和选择


首先来看类和结构体的相同点:
定义属性用于存储值
定义方法用于提供功能
定义附属脚本(subscript)用于访问值
定义构造器用于初始化值和配置
通过扩展以增加默认实现的功能
符合协议以对某类提供标准功能

不同点在于:(类)
继承允许一个类继承另一个类的特征
类型转换允许在运行时检查和解释一个类实例的类型
解构器(析构过程会提到)允许一个类实例释放任何其所被分配的资源
引用计数允许对一个类的多次使用

则我们通常在下列情况下考虑结构体:
用来封装少量相关简单数据值
预计数据传递会被拷贝而不是引用
结构体中的值类型属性也会被拷贝
不需要继承或被继承特征和行为

集合类型的赋值和拷贝行为


上面说到了值类型和引用类型。在Swift中,集合类型字典和数组在后台均以结构体实现,但是他们的情况稍微有些特殊。
虽然通常值类型的赋值行为都是通过拷贝实现的,我们也不需要害怕过多使用内存而带来的性能问题,Swift会管理所有的值拷贝以确保性能最优化。

字典的赋值和拷贝行为
字典的key/value中,若其为值类型则拷贝值,引用类型则拷贝引用。


数组的赋值和拷贝行为

相比字典数组要复杂的多,当操作数组内容时,数组能提供接近C语言的性能,并且保证拷贝只有在必要时发生。

那么必要时是什么时候呢?是改变数组长度的时候,例如调用了append(), insert(), remove()等函数,数组的拷贝才会发生,不改变时则属于引用传递。



有的时候我们想确保数组的唯一性,这时可以调用unshare方法使其变成唯一拷贝。强制拷贝则使用copy方法。但是copy在任何情况下都会创建新的拷贝,而unshare则会确保唯一引用。


在判定数组是否相同时我们也可以使用"==="来判定两个数组是否共用相同的空间或者元素。


因为他们都非共用空间,所以返回都是false.



有关闭包,枚举,结构体和类的基础知识都讲解完毕。欢迎勘误和讨论。

7、Swift 函数、闭包、类、结构体与枚举的使用指南 本博客详细介绍了 Swift 编程语言中函数、闭包、类、结构体和枚举的基本使用方法及高级特性。内容涵盖函数的创建与优化、嵌套函数、函数作为返回类型和参数、guard 语句的使用、闭包的理解与应用、类与结构体的声明和实例化、类与结构体的区别、枚举的定义与关联值使用,以及一个综合应用示例来展示如何结合这些特性进行实际开发。通过学习这些内容,开发者可以更好地组织和管理代码,实现复杂的功能,并提升代码的可读性和可维护性。 阅读详情

相关推荐

7、Swift编程:函数、闭包、类、结构体与枚举详解

本博客详细介绍了Swift编程中的核心概念,包括函数的使用(如guard语句处理异常输入)、闭包的创建和简化方式、类与结构体的定义及区别、子类的继承与方法重写等内容。通过具体示例代码,帮助开发者掌握如何高效地在实际项目中运用这些特性。博客还提供了代码执行流程的mermaid流程图,便于理解程序逻辑。

w8x9y0z1的博客 70

【Swift】Swift基础语法:函数、闭包、枚举、结构体、类与属性

本文介绍了Swift语言中的函数和闭包基础语法。函数部分包括基本定义、参数特性(外部参数名、可变参数、输入输出参数)以及函数类型与高阶函数用法。闭包部分涵盖基本定义、语法简化规则(类型推断、参数缩写、尾随闭包、运算符函数)以及闭包捕获值机制。这些特性构成了Swift函数式编程的核心基础,支持代码复用和灵活调用。通过示例代码展示了如何定义和使用函数与闭包,包括多返回值、参数传递、高阶函数应用以及闭包简化写法等实用技巧。

Antonio915的博客 1190

7、Swift编程:函数、闭包、类、结构体与枚举的深入探索(上)

本博客分为上下两部分,深入探讨了Swift编程中的核心概念,包括函数、闭包、类、结构体与枚举的使用方法和优化技巧。上篇详细讲解了函数的创建与优化、嵌套函数、函数作为返回类型和参数、使用guard语句提前退出函数以及闭包的理解与简化方式。下篇则重点介绍了类的声明与实例化、初始化器的使用、子类的创建等内容,并通过示例代码展示了如何构建和操作复杂对象。这些内容适合不同层次的Swift开发者,帮助提升代码组织能力和开发效率。

rust6ferris的博客 71

swift基础学习(04)[闭包、函数、枚举、类和结构体]

闭包、函数、枚举、类和结构体

抽筋的小乌龟 1000

一文掌握python图形界面开发PyQt6--(一)基本操作、控件、信号与槽、常用控件、布局管理、事件处理、文件对话框

一文掌握python图形界面开发PyQt6--(一)基本操作、控件、信号与槽、常用控件、布局管理、事件处理、文件对话框

qq_38120851的博客 4046

Lede(OpenWrt)安装和双宽带叠加

LEDE是一个专为路由器和嵌入式设备设计的自由和开源的操作系统。LEDE是OpenWRT项目的一个分支项目。LEDE操作系统包括许多路由器有用的功能,如网络地址转换、防火墙、端口转发、DHCP服务器等。

我的博客 6441

Swift4.0概览(简单值、控制流、闭包和函数、对象和类、枚举和结构体、协议和扩展、错误处理和泛型) --(Swift中文手册)

简单值 使用let来声明常量,使用var来声明变量。 var myVariable = 42 myVariable = 50 let myConstant = 42 声明的时候如果赋值的话,就不需要进行声明类型,因为Swift会根据赋值的类型自动进行类型推断。 如果初始值没有提供足够的信息(或者没有初始值),那你需要在变量后面声明类型,用冒号分割。 let i...

硬币2014 433

LiteratureReading:[2022] Reformer: The Efficient Transformer

所属机构:加州大学伯克利分校(U.C. Berkeley)和谷歌研究(Google Research)。电子邮件:kitaev@cs.berkeley.edu所属机构:谷歌研究(Google Research)。电子邮件:lukaszkaiser@google.com所属机构:谷歌研究(Google Research)。电子邮件:levskaya@google.com大型Transformer模型在许多任务上通常能够达到最先进的结果,但训练这些模型可能非常昂贵,尤其是在处理长序列时。

有朋自远方来,不亦乐乎。 1225

Swift----函数 、 闭包 、 枚举 、 类和结构体 、 属性

1 数组排序 1.1 问题 本案例实现一个整型数组排序的函数,数组排序的规则由传递的规则函数决定。 1.2 方案 首先定义一个整型数组排序函数sortInts,该函数有一个整型数组类型的参数,该参数必须是输入输出参数inout,否则并不能修改数组的值。另外还有一个(Int,Int)->Bool函数类型的参数rule,该参数用于提供数组的排序规则。 然后实现函数s...

weixin_30245867的博客 152

Win11系统重装全记录:从备份Office激活到搞定RAID阵列,我的微星笔记本复活记

本文详细记录了Win11系统重装的完整过程,从数据备份到RAID阵列配置,特别针对微星笔记本的特殊硬件驱动问题提供了解决方案。文章涵盖了Office激活状态备份、BIOS设置、驱动安装顺序等关键步骤,帮助用户顺利完成系统重装并优化性能。

weixin_31421613的博客 309

【数据集】中国广泛时空水质数据集(1980-2022)

简介中国广泛时空水质数据集(1980-2022)

WW、forever的博客 3995

华山论剑之Swift初体验(二)

上一篇博客中,我写到关于Swift的变量,常量,数组,字典,元组,函数等一些基础知识,这一篇文章就谈一下关于结构体,类,协议,枚举,还有闭包的相关知识. 结构体和类 在Swift中结构体和类很相似,然后我们就先看一下结构体的相关知识吧 结构体 struct Frame { //存储属性 : 仅仅做存储值的作用 var x : Float var y : Float var width : Float var height : Float

得不到的永远是骚栋. 237

从数字后端角度谈谈occ电路(二)

从图中,我们可以清晰的看出,当scan_en为1时,test mode为1时,经过一系列逻辑单元后,得到clk_sel输出信号为1,同样可推算fast_clk_en = 0,slow_clk_en为1,此时clk_out输出为slow clk,符合我们预期。在该模式下,是使用slow clock进行scan shift,接着我们开始进行推导;从图中,我们根据逻辑运算可以看出,clk_sel输出信号为0,fast clk en为1,此时通过mux选择,clk out即为fast clk;

芯冰乐 359

swift语言 数组定义_Swift快速入门(二)之 面向对象编程

Swift快速入门(二)之 面向对象编程Swift快速入门(一)之基础语法本文为第二篇《Swift面向对象编程》主要涵盖以下内容 - 函数 - 闭包 - 枚举 - 结构体和类 - 属性 - 初始化函数函数(function)相当于java中的方法。函数的的声明使用 func 关键字。函数声明示例var title = "Hello,函数" //声明函数 func sayHell(){ pr...

weixin_29224529的博客 300

Python3实现基于ARIMA模型来预测茅台股票价格趋势

ARIMA(Autoregressive Integrated Moving Average)模型是一种广泛使用的时间序列分析方法,它可以用于对未来的数据进行预测。ARIMA模型由自回归模型(AR模型)、差分整合模型(I模型)和移动平均模型(MA模型)组成,因此也被称为ARIMA(p,d,q)模型。其中,p表示自回归阶数,d表示差分阶数,q表示移动平均阶数。具体来说,ARIMA模型可以通过以下步骤进行建模:数据预处理:对时间序列进行平稳性检验,如果不满足平稳性,则进行差分操作。

m0_64336780的博客 2万+

基于Qt C++开发一款国产化的福昕风格PDF编辑工具

QString text = QInputDialog::getText(this, "文本批注", "输入批注内容:", QLineEdit::Normal, "", &ok);QString savePath = QFileDialog::getSaveFileName(this, "保存加密PDF", "", "PDF文件 (*.pdf)");QAction* zoomInAct = new QAction(QIcon::fromTheme("zoom-in"), "放大", this);

寒寒豆豆软件公司的博客 237

swift编程入门(非常详细)从零基础入门到精通,看完这一篇就够了

阅读完《the swift programming language 中文版》,对swift语言有了初步的认识。在特点是:swift既是项目开发的编程语言,又有脚本语言的特点;在学习上:swift可以在xcode的playground进行编写,所见即所得,非常适合语法学习。对于swift语言,个人认为就是"站在巨人的肩膀上"的一门语言,及众家之所长。只要熟悉一门主流的编程语言,学习swift的语法都不会太困难。swift和Java语言在某些语法和关键字上面甚是相似,因此在学习时困难不大。

leah126的博客 2万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Swift高级语法学习总结

Swift基础语法学习总结Swift高级语法学习总结Swift语法总结补充(一) 1.函数   1.1 func funcNmae()->(){} 这样就定义了一个函数,它的参数为空,返回值为空,如果有参数和返回值直接写在两个括号里就可以了   1.2 参数需要指明类型,而如果没有返回值可以不写->(),返回值只需要写返回类型,如果写了返回名称,可以在函数调用后...

a8984329的博客 343

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Swift高级

接下来我再看一下,Swift高级。语法,可能会被认为是简单的、零散的,但是我们学习的重点是,将这些简单的、零散的语法熟练掌握,应用到功能的实现中去。这才是我们想要的。 //  main.swift //  Swift-SeniorGrammer // //  Created by CE on 16/7/8. //  Copyright © 2016年 vcch

软工官博 2174

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Swift 学习笔记 - 02

1.函数可以返回一个函数. 也可以将一个函数以参数的形式传入 2.nil  代表的含义和OC中的nil不太一样了.  1.在Swift中.nil可以赋值给任何声明为optional的变量,而不仅仅只是对象变量了(未声明为optional的变量不能赋值为nil). 注意.若对象变量不被显示地声明为optional,它也不能设置nil...... 2.在OC中nil代表的是一个

一口鸟的博客 590

swift编程入门(非常详细)从零基础入门到精通,看完这一篇就够了_swift教程

/ Swift 的 String 类型定义了关于大于号(>)的字符串实现,其作为一个函数接受两个 String 类型的参数并返回 Bool 类型的值。// 你可以直接通过 super.someProperty 来返回继承来的值,其中 someProperty 是你要重写的属性的名字。// 可以在一个枚举中定义一组相关的枚举成员,每一个枚举成员都可以有适当类型的关联值。// 如果你不想在重写版本中的 getter 里修改继承来的属性值,// 直接通过 $0,$1,$2 来顺序调用闭包的参数,以此类推。

2401_84254530的博客 818

swift入门测试题

// // main.swift // 2016080417何润 // // Created by student on 2018/10/9. // Copyright © 2018年 何润. All rights reserved. // import Foundation enum PowerType{ case Electric//表示电力动力 case ...

圣三一 2815
上一篇: Swift的流程控制和函数
下一篇: Swift的属性,方法,下标脚本以及继承
RannieR
博客等级 码龄14年 180粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值