Swift专题讲解二十三——高级运算符

Easter79
• 阅读 455

Swift专题讲解二十三——高级运算符

一、引言

        除了前边博客中介绍的基本运算符外,Swift中还支持更多高级运算符,也支持开发者进行运算符的自定义。Swift中的算符运算符有一个特点,其不会产生溢出,如果有操作产生溢出,程序会直接抛出异常。如果开发者在开发中需要有溢出操作,需要使用溢出操作符来实现。

二、位运算符

        Swift支持C语言中的全部位运算符,示例如下:

//二进制数据8 实际上a = 00001000 8位
var a:UInt8 = 0b1000
//使用~ 进行按位取反运算 a = 0b11110111  247
a = ~a
//使用& 进行按位与运算 a = 0b11110000 240
a = 0b11110000&a
//使用|进行按位或运算 a=0b11111111 255
a = 0b11111111|a
//使用^进行按位异或运算 a = 0b00001111 15
a = 0b11110000^a
//使用<<进行按位左移运算 a = 0b00011110 30
a = a<<1
//使用>>进行按位右移运算 a = 0b00001111
a = a>>1

Swift中还提供了一种检查机制,当存在溢出操作时,程序会抛出异常,这样可以是开发者编写的代码更加安全,如果开发者真的需要使用溢出操作,Swift中还额外提供了支持溢出操作的运算符:

//a = 255 + 1 这样的运算会报错 &+ 为溢出加运算符 计算后a=0
a = 255 &+ 1
//&- 为溢出减运算符 计算后 a = 255
a = a &- 1
//&* 为溢出乘运算符
a = a &* 2

三、重载运算符

        运算符的重载是为原有的运算符增加新的功能,开发者可以自定义一些运算符函数来实现对具体类和结构体运算的功能,示例如下:

class Circle {
    //圆心
    var point:(p1:Float,p2:Float)
    //半径
    var r:Float
    init(point:(Float,Float),r:Float){
        self.point = point
        self.r = r
    }
}
func + (c1:Circle,c2:Circle) -> Circle {
    return Circle(point: c1.point, r: c1.r+c2.r)
}

上面代码演示的例子中重载了中缀运算符,即运算符是出现在两个操作数和中间的,还可以进行前缀运算符与后缀运算符的重载,使用prefix与postfix即可。示例如下:

prefix func + (c:Circle) -> Circle {
    return Circle(point: c.point, r: c.r*2)
}

复合运算符也可以支持重载,需要注意的是,复合运算符的参数必须是inout修饰的,因为复合运算符会直接操作参数值:

func += (inout c1:Circle,c2:Circle) {
    c1 = Circle(point: c1.point, r: c1.r+c2.r)
}

等价运算符也可以用来重载,通常用来进行比较操作,示例如下:

func == (c1:Circle,c2:Circle) -> Bool {
    return (c1.point==c2.point && c1.r==c2.r)
}
func != (c1:Circle,c2:Circle) -> Bool {
    return ((c1.point != c2.point) || (c1.r != c2.r))
}

四、自定义运算符

        Swift中除了可以对一些已经存在的运算符进行重载操作外,开发者还可以自定义一些运算符,在自定义运算符时,必须指定运算符是前缀、中缀或是后缀,示例如下:

//定义一个中缀运算符+!+ operator关键字用于定义运算符
infix operator +!+{}
//进行运算符的实现
func +!+ (param:Int,param2:Int)->Int{
    return (param+param2)*param2
}
var b = 5 +!+ 5

还有一点需要注意,在进行自定义运算符时,开发者也可以为其设置结合性与优先级,结合性由associativity关键字定义,可选left,right,none,优先级的默认值为100,由precedence关键字指定,示例如下:

//定义一个中缀运算符+!+
infix operator +!+{associativity left precedence 140}
//进行运算符的实现
func +!+ (param:Int,param2:Int)->Int{
    return (param+param2)*param2
}
var b = 5 +!+ 5

专注技术,热爱生活,交流技术,也做朋友。

——珲少 QQ群:203317592

点赞
收藏
评论区
推荐文章
Irene181 Irene181
2年前
一篇文章带你了解Python运算符重载
您可以根据所使用的操作数来更改Python中运算符的含义。这种做法称为运算符重载,今天我们一起来聊聊运算符重载。一、什么是Python中的运算符重载?Python运算符用于内置类。但是相同的运算符对不同的类型有不同的行为。例如,运算符将对两个数字执行算术加法、合并两个列表并连接两个字符串。Python中的这一功能允许同一运算符根据上下文具有不同的含
Irene181 Irene181
2年前
一篇文章带你了解Python运算符重载
您可以根据所使用的操作数来更改Python中运算符的含义。这种做法称为运算符重载,今天我们一起来聊聊运算符重载。一、什么是Python中的运算符重载?Python运算符用于内置类。但是相同的运算符对不同的类型有不同的行为。例如,运算符将对两个数字执行算术加法、合并两个列表并连接两个字符串。Python中的这一功能允许同一运算符根据上下文具有不同的含
CuterCorley CuterCorley
3年前
C语言入门系列之4.分支结构程序-关系、逻辑运算和if、switch语句
一、关系运算符和表达式关系运算符:又叫比较运算符,在程序中经常需要比较两个量的大小关系,以决定程序下一步的工作。比较两个量的运算符称为关系运算符。1.关系运算符及其优先顺序在C语言中有以下关系运算符:<小于<小于或等于\大于\大于或等于等于不等于关系运算符都是双目运算
Wesley13 Wesley13
2年前
thinkphp3.2.3模板渲染支持三元表达式
thinkphp3.2.3模板渲染支持三元表达式{$status?'正常':'错误'}{$info'status'?$info'msg':$info'error'}注意:三元运算符中暂时不支持点语法。如下:           <divclass"modalhidefade"id'myModa
Stella981 Stella981
2年前
Python 运算符
Python运算符什么是运算符?本章节主要说明Python的运算符。举个简单的例子459。例子中,4和5被称为操作数,""称为运算符。Python语言支持以下类型的运算符:算术运算符(https://www.oschina.n
Wesley13 Wesley13
2年前
Java运算符
Java中的运算符分类:算术运算符二元运算符,,\,/,%一元运算符,赋值运算符\扩展运算符,,\,/关系运算符\,<,,<,,! instanceof逻辑运算符&&,||,!,^位运算符&,|,^,~,,<<,条件运算符
Stella981 Stella981
2年前
Python运算符
1.运算符1.1运算符的概念运算符⽤于执⾏程序代码运算,会针对⼀个以上操作数项⽬来进⾏运算。例如:23,其操作数是2和3,⽽运算符则是“”1.2运算符的分类算术运算符赋值运算符⽐较运算符(关系运算符)逻辑运算符条件运算符(三元运算符)2.算术运算符
Easter79 Easter79
2年前
Swift解读专题三——基础运算符
Swift解读专题三——基础运算符一、引言         运算符是编程语言不可缺少的一个部分,Swift中除了支持C中的运算符外,还提供了一些更加强大的运算符功能,例如取余符%可以用来计算浮点数,另外新增了两种范围运算符。Swift中有3类运算符:1.一元运算符运算符作用于一个操作数,可以出现在操
小万哥 小万哥
6个月前
Python 运算符
运算符用于对变量和值执行操作。在下面的示例中,我们使用运算符将两个值相加:pythonprint(105)Python将运算符分为以下几组:算术运算符赋值运算符比较运算符逻辑运算符身份运算符成员运算符位运算符算术运算符算术运算符用于对数字值执行常见的数
小万哥 小万哥
3个月前
C# 运算符详解:包含算术、赋值、比较、逻辑运算符及 Math 类应用
运算符用于对变量和值执行操作。在C中,有多种运算符可用,包括算术运算符、关系运算符、逻辑运算符等。算术运算符算术运算符用于执行常见的数学运算:csharpintx10050;//加法,结果为150intyx30;//减法,结果为120intzx2;//乘
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k