文档章节

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

珲少
 珲少
发布于 2016/05/31 15:35
字数 952
阅读 1712
收藏 27

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

© 著作权归作者所有

珲少

珲少

粉丝 886
博文 394
码字总数 475753
作品 0
上海
程序员
私信 提问
加载中

评论(1)

float2net
float2net
只是增加了语言的复杂性。
Swift讲解专题十——类与结构体

Swift讲解专题十——类与结构体 一、引言 Swift中的类与结构体十分相似,和Objective-C不同的是,Swift中的结构体不仅可以定义属性,也可以像类一样为其定义方法。 Swift中的类与结构体有如下...

珲少
2016/05/16
112
0
Swift讲解专题八——闭包

Swift讲解专题八——闭包 一、引言 Swift中的闭包是有一定功能的代码块,这十分类似于Objective-C中的block语法。Swift中的闭包语法风格十分简洁,其作用和函数的作用相似。 二、从一个系统函...

珲少
2016/05/14
886
3
Swift解读专题三——基础运算符

Swift解读专题三——基础运算符 一、引言 运算符是编程语言不可缺少的一个部分,Swift中除了支持C中的运算符外,还提供了一些更加强大的运算符功能,例如取余符%可以用来计算浮点数,另外新增...

珲少
2016/05/09
261
0
Swift讲解专题五——集合类型

Swift讲解专题五——集合类型 一、引言 Swift中提供了3种集合类型,Array数据类型,Set集合类型,Dictionary字典类型。Array用于存放一组有序的数据,数据角标从0开始一次递增;Set用于存放一...

珲少
2016/05/11
429
0
Swift讲解专题六——流程控制

Swift讲解专题六——流程控制 一、引言 一种编程语言的强大与否,很大程度上取决于其提供的程序流程控制方案,就如使用汇编语言实现复杂的程序流程是一件痛苦的事情。Swift中提供了许多强大的...

珲少
2016/05/12
388
0

没有更多内容

加载失败,请刷新页面

加载更多

Mybatis 源码(二)Mybatis 初始化

Mybatis 初始化是由SqlSessionFactoryBuilder来完成的,主要的工作解析XML文件,并将解析的类容封装到Configuration类中,最后将Configuration类封装到SqlSessionFactory中并返回,自此初始化...

xiaolyuh
21分钟前
7
0
约瑟夫环问题

约瑟夫环问题的原来描述为,设有编号为1,2,……,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,...

mskk
31分钟前
4
0
JEP解读与尝鲜系列1 - Java Valhalla与Java Inline class

涉及到的JEP: Project Valhalla JEP 169: Value Objects JEP 218: Generics over Primitive Types 这些特性将在JDK14实现 Valhalla项目背景 最主要的一点就是,让Java适应现代硬件:在Java语...

zhxhash
33分钟前
8
0
总结:Redis集群

一、redis集群方案 Master-slave方式,Master和Slave的数据一致,Slave从Master同步数据,然后通过Sentinal(哨兵)监控Master和Slave的健康状态,当异常的时候迅速切换,如Master宕机的时候...

浮躁的码农
36分钟前
6
0
三个盘子的汉诺塔

package base;/** * 汉诺塔 */public class TowerApp { static int nDisks = 3; public static void main(String[] args) { doTowers(nDisks, 'A','B',......

clean123
37分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部