swift学习笔记(22)- 高级运算符

IOS开发Swift笔记18-高级运算符 关于String的思考 1个String变量占用多少内存? 下面2个String变量,底层存储有什么不同? var str1 = "0123456789" var str2 = "0123456789ABCDEF" 阅读详情

Swift 支持 C 语言中的全部位运算符。
主要记下特殊的高级运算符

溢出运算符

在默认情况下,当向一个整数赋予超过它容量的值时,Swift 默认会报错,而不是生成一个无效的数。这个行为为我们在运算过大或着过小的数的时候提供了额外的安全性。

例如,Int16 型整数能容纳的有符号整数范围是 -32768 到 32767,当为一个 Int16 型变量赋的值超过这个范围时,系统就会报错:

var potentialOverflow = Int16.max
// potentialOverflow 的值是 32767,这是 Int16 能容纳的最大整数
potentialOverflow += 1

// 这里会报错
为过大或者过小的数值提供错误处理,能让我们在处理边界值时更加灵活。

然而,也可以选择让系统在数值溢出的时候采取截断处理,而非报错。可以使用 Swift 提供的三个溢出运算符来让系统支持整数溢出运算。这些运算符都是以 & 开头的:

溢出加法 &+
溢出减法 &-
溢出乘法 &*

var unsignedOverflow = UInt8.max
// unsignedOverflow 等于 UInt8 所能容纳的最大整数 255
unsignedOverflow = unsignedOverflow &+ 1
// 此时 unsignedOverflow 等于 0

运算符函数

类和结构体可以为现有的运算符提供自定义的实现,这通常被称为运算符重载。

下面的例子展示了如何为自定义的结构体实现加法运算符(+)。算术加法运算符是一个双目运算符,因为它可以对两个值进行运算,同时它还是中缀运算符,因为它出现在两个值中间。

例子中定义了一个名为 Vector2D 的结构体用来表示二维坐标向量 (x, y),紧接着定义了一个可以对两个 Vector2D 结构体进行相加的运算符函数:

struct Vector2D {
    var x = 0.0, y = 0.0
}

extension Vector2D {
    static func + (left: Vector2D, right: Vector2D) -> Vector2D {
        return Vector2D(x: left.x + right.x, y: left.y + right.y)
    }
}

该运算符函数被定义为 Vector2D 上的一个类方法,并且函数的名字与它要进行重载的 + 名字一致。因为加法运算并不是一个向量必需的功能,所以这个类方法被定义在 Vector2D 的一个扩展中,而不是 Vector2D 结构体声明内。而算术加法运算符是双目运算符,所以这个运算符函数接收两个类型为 Vector2D 的参数,同时有一个 Vector2D 类型的返回值。

在这个实现中,输入参数分别被命名为 left 和 right,代表在 + 运算符左边和右边的两个 Vector2D 实例。函数返回了一个新的 Vector2D 实例,这个实例的 x 和 y 分别等于作为参数的两个实例的 x 和 y 的值之和。

这个函数被定义成全局的,而不是 Vector2D 结构体的成员方法,所以任意两个 Vector2D 实例都可以使用这个中缀运算符:

let vector = Vector2D(x: 3.0, y: 1.0)
let anotherVector = Vector2D(x: 2.0, y: 4.0)
let combinedVector = vector + anotherVector
// combinedVector 是一个新的 Vector2D 实例,值为 (5.0, 5.0)

赋值运算符

extension Vector2D {
    static func += (left: inout Vector2D, right: Vector2D) {
        left = left + right
    }
}

等价运算符

extension Vector2D {
    static func == (left: Vector2D, right: Vector2D) -> Bool {
        return (left.x == right.x) && (left.y == right.y)
    }
    static func != (left: Vector2D, right: Vector2D) -> Bool {
        return !(left == right)
    }
}

前缀和后缀运算符

上个例子演示了一个双目中缀运算符的自定义实现。类与结构体也能提供标准单目运算符的实现。单目运算符只运算一个值。当运算符出现在值之前时,它就是前缀的(例如 -a),而当它出现在值之后时,它就是后缀的(例如 b!)。

要实现前缀或者后缀运算符,需要在声明运算符函数的时候在 func 关键字之前指定 prefix 或者 postfix 修饰符:

extension Vector2D {
    static prefix func - (vector: Vector2D) -> Vector2D {
        return Vector2D(x: -vector.x, y: -vector.y)
    }
}

这段代码为 Vector2D 类型实现了单目负号运算符。由于该运算符是前缀运算符,所以这个函数需要加上 prefix 修饰符。

对于简单数值,单目负号运算符可以对它们的正负性进行改变。对于 Vector2D 来说,该运算将其 x 和 y 属性的正负性都进行了改变:

let positive = Vector2D(x: 3.0, y: 4.0)
let negative = -positive
// negative 是一个值为 (-3.0, -4.0) 的 Vector2D 实例
let alsoPositive = -negative
// alsoPositive 是一个值为 (3.0, 4.0) 的 Vector2D 实例

自定义运算符

除了实现标准运算符,在 Swift 中还可以声明和实现自定义运算符。可以用来自定义运算符的字符列表请参考运算符。

新的运算符要使用 operator 关键字在全局作用域内进行定义,同时还要指定 prefix、infix 或者 postfix 修饰符:

prefix operator +++ {}
上面的代码定义了一个新的名为 +++ 的前缀运算符。对于这个运算符,在 Swift 中并没有意义,因此我们针对 Vector2D 的实例来定义它的意义。对这个示例来讲,+++ 被实现为“前缀双自增”运算符。它使用了前面定义的复合加法运算符来让矩阵对自身进行相加,从而让 Vector2D 实例的 x 属性和 y 属性的值翻倍。实现 +++ 运算符的方式如下:

extension Vector2D {
    static prefix func +++ (vector: inout Vector2D) -> Vector2D {
        vector += vector
        return vector
    }
}
var toBeDoubled = Vector2D(x: 1.0, y: 4.0)
let afterDoubling = +++toBeDoubled
// toBeDoubled 现在的值为 (2.0, 8.0)
// afterDoubling 现在的值也为 (2.0, 8.0)

自定义中缀运算符的优先级

每个自定义中缀运算符都属于某个优先级组。这个优先级组指定了这个运算符和其他中缀运算符的优先级和结合性。优先级和结合性中详细阐述了这两个特性是如何对中缀运算符的运算产生影响的。

而没有明确放入优先级组的自定义中缀运算符会放到一个默认的优先级组内,其优先级高于三元运算符。

以下例子定义了一个新的自定义中缀运算符 +-,此运算符属于 AdditionPrecedence 优先组:

infix operator +-: AdditionPrecedence
extension Vector2D {
    static func +- (left: Vector2D, right: Vector2D) -> Vector2D {
        return Vector2D(x: left.x + right.x, y: left.y - right.y)
    }
}
let firstVector = Vector2D(x: 1.0, y: 2.0)
let secondVector = Vector2D(x: 3.0, y: 4.0)
let plusMinusVector = firstVector +- secondVector
// plusMinusVector 是一个 Vector2D

实例,并且它的值为 (4.0, -2.0)
这个运算符把两个向量的 x 值相加,同时用第一个向量的 y 值减去第二个向量的 y 值。因为它本质上是属于“相加型”运算符,所以将它放置 + 和 - 等默认的中缀“相加型”运算符相同的优先级组中。关于 Swift 标准库提供的运算符,以及完整的运算符优先级组和结合性设置,请参考 Swift Standard Library Operators Reference。而更多关于优先级组以及自定义操作符和优先级组的语法,请参考运算符声明

注意
当定义前缀与后缀运算符的时候,我们并没有指定优先级。然而,如果对同一个值同时使用前缀与后缀运算符,则后缀运算符会先参与运算。

杰理JL701N内置flash录音配置教程 本文详细介绍了内置Flash录音功能的配置方法。主要内容包括:1) 基础模式配置(开启音乐/录音模式、Flash录音宏定义);2) 录音参数设置(格式基准值、存储区域定义、容量配置);3) MP3编码特殊处理;4) 下载时的Flash格式化操作;5) 录音开关和播放接口的使用说明。配置过程涉及多个关键文件的修改,并强调存储容量的精确分配。 阅读详情

相关推荐

01 AUTOSAR CP标准文档阅读指南

01 AUTOSAR CP标准文档阅读指南

汽车软件工程师 | 好奇博主 | 处女座 1134

高级运算符

位运算符 // 1. 按位取反运算符 var a: UInt8 = 0b00001111 var b = ~a print(b,terminator:"\n\n") // 2. 按位与运算符 var c = a & b print(c,terminator:"\n\n") // 3. 按位或运算符 var d = a | b print(d,terminator:"\n\n") ...

qq_17190231的博客 554

Zynq-PS-SDK(12) 之 VDMA+VTC+AXI4S-VideoOut 视频通路硬件搭建

前面分别叙述了《Zynq-PS-SDK(9) 之 VDMA》、《Zynq-PS-SDK(10) 之 VTC》以及《Zynq-PS-SDK(11) 之 AXI4-Stream To Video Out》;搭建一个简单的视频通路(Framebuffer -> HDMI)就要用到这些个模块,总体的设计框图如下所示: 视频数据的 Framebuffer 在 DDR 中,通过 Processing System 写入进去; 数据通过高带宽的 AXI4 接口(这里用到了 HP AXI,即 64bits 带

StephenZhou 5589

Swift 基本运算符

运算符是检查、改变、合并值的特殊符号或短语。例如,加号(+)将两个数相加(如 let i = 1 + 2)。更复杂的运算例子包括逻辑与运算符 &&(如 if enteredDoorCode && passedRetinaScan)。Swift 所支持运算符你可能在别的语言比如 C 语言里已经认识了,同时为了减少常见编码错误对它们做了部分改进。如:赋值符(=)不再有返回值,这样就消除了手误将判等运算符(==)写成赋值符导致代码错误的缺陷。

xiaoxiaobukuang的专栏 1415

ThinkBook 16p 2024 BIOS降压定频实战:从解锁CFG Lock到AC Loadline调优

高性能笔记本在满载时频繁撞上温度墙,通常源于固件层默认电压冗余过大,而系统级降压工具又受限于CFG Lock锁定。要根治问题,需要从BIOS固件层面理解电压管理机制——AC/DC Loadline参数控制着CPU在不同负载下的电压请求,通过修改这些负载线值可以安全降低电压,解锁CFG Lock后还能让XTU、ThrottleStop等软件调参工具恢复可用。这种BIOS级调优在工程实践中广泛用于改善散热、稳定频率、压降风扇噪音,尤其适用于联想ThinkBook 16p 2024与拯救者Y9000P等采用HX平

weixin_32496547的博客 387

ovs实现lb负载均衡

负载均衡器的实现原理是通过硬件或软件设备将客户端访问流量根据转发策略分发到多个服务器或设备上,以确保系统的负载均衡。二层负载均衡‌:使用虚拟MAC地址方式,根据OSI模型的二层进行负载均衡。‌四层负载均衡‌:基于IP+端口的负载均衡,主要分析IP层及TCP/UDP层,实现四层负载均衡。‌七层负载均衡‌:从应用层开始,根据虚拟的URL或IP、主机名接收请求,再转向相应的处理服务器。

bobi的博客 951

Swift --- 高级运算符

溢出运算符(Overflow Operator) Swift的算数运算符出现溢出时会抛出运行时错误 Swift有溢出运算符(&+、&-、&*),用来支持溢出运算符 运算符重载 struct Point { var x = 0, y = 0 static func + (p1: Point, p2: Point) -> Point { ...

宋卓的博客 293

PLC的自抗扰控制(ADRC)算法

1、自抗扰控制算法,网上很多文章有所讲解,大家也可以关注韩京清教授的论文和书籍,这里就不赘述了,下面给出梯形图+SCL代码。 1、跟踪微分器 2、线性控制率 3、博图SCL控制代码 4、ADRC控制算法的所有公式汇总 ......

RXXW_Dor的博客 3853

Swift学习笔记——运算符

运算符基本概念 1、一元运算符对一个目标进行操作,一元前缀运算符,如:!b,一元后缀运算符,如:b! 2、二元运算符对两个目标进行操作,如a+b,因为它出现在两个目标之间,所以是中缀 3、三元运算符操作三个目标,Swift语言中,只有一个三元运算符,三元条件运算符(a ? b : c) Swift中对运算符的改进: 1、支持C语言中大多数标准运算符,同时也增加了一些排除常见代码错误的能力 2、赋值符号(=)不会返回值,防止它被用于(==)的意图上面 3、算数符号(+、-、*、/、%以及其他)可以检测并

Homezzh的博客 1272

yolov8知识蒸馏代码详解:支持logit和feature-based蒸馏

特别地,在COCO数据集上对MAP中的RetinaNet检测器(resnet50主干)获得了3.4%的性能提升,在Cityscapes数据集上, 针对mIoU指标,PSPNET(resnet-18 backbone)获得5.81%的性能提升。大部分的KD方法都是通过algin学生网络和教师网络的归一化的feature map, 最小化feature map上的激活值的差异。MGD是一种真正通用的基于特征feature的知识蒸馏方法,它可以用于各种任务,包括图像分类,目标检测,语义分割和实例分割。

@bangbang的博客 7285

innovus:set_clock_latency与insertion_delay

当1ns clock latency设置在capture上,在report_timing报告中体现在other end arrival time以及capture clock path的Arrival Time上。因为-1ns的insertion delay存在,所以skew group报告中显示的Arrival (ns)是减1ns的结果,即1.819-1=0.819 ns。CTS阶段create_ccopt_clock_tree_spec之后,spec中会产生对应的insertion_delay命令。

m0_61544122的博客 1620

Swift学习笔记18-高级运算符

Swift学习笔记18-高级运算符。

qq_27328363的博客 34

YOLOv12超参数智能优化:基于内置Ray Tune的自动化调优实战指南

购买即可解锁300+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,别人有的本专栏也有! 目标检测模型的性能瓶颈往往源于超参数配置不当。传统手动调优方式不仅耗时耗力,且难以找到全局最优解。YOLOv12集成的Ray Tune框架为解决这一难题提供了完整方案,通过分布式异步优化算法,可实现超参数搜索效率的指数级提升。实际测试表明,采用Ray Tune自动调优的YOLOv12模型,在COCO数据集上mAP指标平均提升3.8%,收敛速度加快2.1倍。在VisDrone无人机数据集上的跨域测试

LXY_LOVE36的博客 119

Swift基本运算符详解

运算符是检查,改变,合并值的特殊符号或短语。例如,加号+将两个数相加(如let i = 1 + 2)。复杂些的运行算例如逻辑与运算符&&(如if enteredDoorCode && passedRetinaScan),又或让 i 值加1的便捷运算符自增运算符++i等。 Swift 支持大部分标准 C 语言的运算符,且改进许多特性来减少常规编码错误。如,赋值符(=)不返回值,以防止把想要判断

听海Movie的专栏 642

VC中sqlite的使用

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

NTscan扫描工具

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

Swift3.0学习笔记-Basic Operators(基本运算符)

Swift第2节

brycegao321的博客 1040

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Swift 6 学习笔记(三)Basic Operators

这篇笔记也是同步 Swift 6 官方教程中的第三篇 《Basic Operators》,主要Swift中涉及到的基础运算符,如果你已经有了其他语言的编程基础,那么理解这一章节的难度很小。

nenchoumi3119的博客 862

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Swift6.1 - 基本运算符

Swift运算符分为基本运算符、算术运算符、比较运算符等。基本运算符包括赋值(=)、算术(+、-、*、/、%)和比较(==、>等)。Swift改进了C语言的运算符,如赋值运算符不返回值以避免错误。还新增了区间运算符(..<、...)。运算符分为一元、二元和三元,三元条件运算符(a ? b : c)是唯一的三元运算符。算术运算符禁止值溢出,支持字符串拼接。比较运算符返回布尔值,支持元组比较。三元运算符简化条件判断,如rowHeight = contentHeight + (hasHeader ?

chenzimin_blog 1217

Swift-运算符重载

目录 1. 全局运算符重载 2. 局部重载 3. 结构体遵守Equatable 协议 4. 枚举 遵守Equatable协议 5. 遵守Comparable协议 6. 自定义运算符 1. 全局运算符重载 struct Point { var x = 0, y = 0 } // 全局的重载 func + (p1: Point, p2: Point) -> Point{ Point(x: p1.x + p2.x, y: p1.y + p2.y) } var p1..

Batac的博客 1037

Swift 基本运算符之数值运算

运算符是检查, 改变, 合并值的特殊符号或短语. 例如, 加号 + 把计算两个数的和(如 let i = 1 + 2). 复杂些的运行算包括逻辑与&&(如 if enteredDoorCode && passedRetinaScan),还有自增运算符 ++i 这样让自身加一的便捷运算。下面介绍基础运算符中的数值运算。 数值运算 Swift 让所有数值类型都支持了基本的四则运算: 加法 + 减法 - 乘法 * 除法 / 1 + 2 // 等于 3 5 - 3 // 等于 2 2

记录从移动端、鸿蒙到物联网与AI的完整实战与思考。专注于分享可复用的工程方案与产品思维,尤其深入鸿蒙生态与全栈开发。以十年工程与管理沉淀,为你提供清晰的技术纵深路径。坚信技术的价值在于“贯通”与“落地”。 1538

Swift运算符

运算符分类 运算符分类 一元运算符 1.负号运算符 1 var number1 = 10 2 var number2 = -number1 2.正号运算符 1 //正号运算符不做任何操作 2 var number3 = +number2 3 println(number3) 4 //b = a++ 相当于a先赋值,在完成自增,而b = ++a,相...

adqarcl231082的博客 134

十六、高级运算符

/* 1.溢出运算符:&+、&-、&*用来支持溢出运算 swift的算术运算符出现溢出时会抛出运行时错误 */ var min = UInt8.min print(min &- 1) //255 var max = UInt8.max print(max &+ 1) //0 print(max &* 2) //255 * 2 - 256 = 254 //2.运算符重载 struct Point { var x = 0, y = 0 st...

u013886407的博客 463

18-高级运算符

溢出运算符(OverflowOperator) Swift的算数运算符出现溢出时会抛出运行时错误 Swift有溢出运算符(&+、&-、&*),用来支持溢出运算 var min = UInt8.min print(min &- 1) // 255, Int8.max var max = UInt8.max print(max &+ 1) // 0, Int8.min print(max &* 2) // 254, 等价于 max &+ max .

qq_37228036的博客 313

10个Euler自定义运算符让Swift数学运算更直观

Euler是一个为Swift语言提供数学符号自定义运算符的强大工具库,通过引入直观的数学符号,让代码中的数学运算更接近手写数学表达式,极大提升了科学计算代码的可读性和编写效率。无论是基础算术还是复杂的数学逻辑判断,Euler都能帮助开发者以更自然的方式表达数学思想。 ## 1. 乘法运算符×:让代码像数学公式一样直观 传统Swift中使用`*`表示乘法,而Euler提供了更符合数学书写习惯的`

gitblog_00603的博客 1063

Swift中文教程(二)基本运算符

1、基本运算符 运算符是一种特定的符号或表达式,用来检验、修改或合并变量。例如,用求和运算符+可以对两个数字进行求和(如let i = 1 + 2);稍微复杂一点的例子有逻辑与操作符&amp;&amp; (如if enteredDoorCode &amp;&amp; passedRetinaScan) ,自增长运算符 ++i (这是i=i+1的简写方式) Swift支持C标准库中的大多数...

Just Code 114

Swift中运算符相关内容

自定义运算符 (Custom Operator) 可以自定义新的运算符:在全局作用域使用operator进行声明

run_in_road的博客 820

Swift学习笔记基础语法-基本运算符

1.赋值运算符 2.算数运算符 3.取余运算符 4.三目运算符 5.区间运算符

d1w2hj的博客 736
上一篇: swift学习笔记(21)- 访问控制
下一篇: swift 简单易用类似新闻客户端的结构
winterLiao
博客等级 码龄10年 5粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值