Swift之需要注意的基本运算符和高级运算符

在去年翻译《Swift编程入门经典》(Swift1.0版本,基于Xcode6)这本书时,系统的搞了搞Swift语言,接下来的一段时间内打算持续更新一下相关Swift语言的一些东西, 不过现在已经是Swift2.0版本了,区别还是不小的。并且目前在工作中正重构着整个项目的代码,之后根据一些项目实例再更新一些关于代码重构的博客与大家交流一下,然后再整理一些Android开发的一些东西吧,当然是类比着iOS开发了。

  废话少说,开始今天博客的主题。有些小伙伴看到今天的博客Title可能会笑到,基本运算符有什么好说的,只要会编程的,都会使用基本运算符。此话不假,但是今天博客的主题不是介绍++i还有i++的区别的。今天博客中介绍那些在Swift中比较独特的基本运算符,这些运算符会让你眼前一亮(有些是在OC语法中渴望使用到的)。不积跬步无以至千里,不积小流无以成江海。虽然需要进阶,但是基础还是蛮重要。今天博客前半部分是需要注意的基础运算符,有基础运算符当然就有高级运算符,接着会介绍一些高级运算符。今天就窥探一下Swift2.0的东西(基于Xcode7.1)

一. 需注意的基础运算符

  1. 赋值运算符(=)

    在Objective-C,C等一些语言中允许你在表达式中使用=号, 如下所示。 testNumber = 20会返回一个bool类型的值YES。 testNumber = 20在表达式中是永真的。所以下方的代码会打印Log中的内容。

1     NSInteger testNumber = 10;2     if ((testNumber = 20)) {3         NSLog(@"testNumber = %ld", testNumber);4     }

    在Swift中是不允许这样做的,从这一点也能看出Swift语言的安全性。如果你在Swift写了上面的代码,就会报出下面的错误。IDE就会提示你,问你是不是应该使用==预算符。

  2.类型安全性,不允许隐式类型转换

    这一点也是Swift语言的一个优势,在Swift语言中是不允许你使用隐式类型转换的。即便是Double类型和Float类型进行隐式类型转换也是不可以的。而在Objective-C中是可以进行隐式类型转换的。看下方实例:

    在Objective-C中你可以这样做, 下方代码是可以编译通过的。两种类型(Float32, Float64)不同的数据进行相加,然后再把结果隐式转换成另一种类型(NSInteger)。

1     Float32 floatNumber1 = 10.0f;2     Float64 floatNumber2 = 20.0f;3     NSInteger result = floatNumber1 + floatNumber2;

    上面的代码在Swift中如下,IDE会报一个错误,如下所示。错误的大致意思就是你不能把Float32类型的数据与Float64类型的数据进行相加。其本质原因是在Swift语言中是不允许你进行隐式类型

    在Swift中对上述代码进行类型显示转换,编译就会通过。在Playground中就会显示相应的结果值。

  3.取模运算(%)的特殊性

    还是以Objective-C做类比,在Objective-C中取模运算(%)只支持整型,如果在取模运算中你使用了浮点类型,那么就会报出如下错误。大概意思就是取模运算不支持浮点类型,请转换成NSInteger类型。

    而Swift中的取模运算就支持浮点类型,上面的语句在Swift中就不会报错,下方是上述事例在Playground中的结果值:

  4. nil聚合(合并,连接)运算符(??)

    该运算符可谓是Swift中添加的新特性,??运算符在Objective-C中是没有的。但是??不是Swift的原创,在C#中也是有??运算符的,而且用法和Swift中??用法类似。都是用来处理nil值的运算符,通过一个实例来进行介绍,一目了然。

    在实例中我们先定义一个可选类型的字符串变量developLanguage,来记录开发语言, 再定义一个选择开发语言的字符串变量selectLanguage。如果developLanguage的值为nil的话,默认选择的语言是“Swift”。 如果developLanguage的值不为nil, 就强制打开可选类型的值,把该值赋值给字符串变量selectLanguage。具体代码如下所示:

    接下来就是预算符??出厂的时候了,一个??的功能就是上面代码中if -- else的功能。也就是说上面的if -- else 语句可以使用下方的??运算符来代替。下面要注意一点的是在??运算符中使用可选类型变量时没有使用!强制打开可选类型的值, 因为在??运算符中能确保使用的可选类型变量中有值,如果没有值就不打开使用,所以就可以把!省略掉。

  5.比较运算符支持字符串

    在Objective-C中你可以使用比较运算符来比较运算符,这样做编译器是不会报错的,但是你不会得到你想要的结果。如果你直接用比较运算符来比较字符串的话实质上是比较的字符串的内存地址,请看下方Objective-C的代码。有下方的输出结果不难看出比较的是字符串的内存地址。

    在Swift中你可以使用比较运算符来比较字符串,如下所示:

  6.区间运算符

    区间运算符可以表示两个值之间的范围。... 是闭区间运算符,比如a...b表示a到b这个区间并且包括a和b的值。 ..<是半开区间, 比如a..<b 表示a到b这个区间的值,不包括b。其用法如下:

    下方代码使用的是闭区间运算符1...10, 会循环10次

      

    如果改成半开区间,那么就是循环9次

二. Swift中的高级运算符

  1.Swift中的位运算

    如果你在大学课程中学过数字电路这门课程的话,想必不会对位运算陌生的。在好多编程语言中也都有位运算。位运算应用得当可以提高算法的效率,在一些高效的算法中有时会用到位运算,再此就不做过多的讨论了。接下来将会搞一搞Swift中的按位与,按位或,按位异或以及按位取反等操作。

    (1) 按位与(&)

    对二进制中的每一位进行与操作,所以叫按位与。运算规则为1 & 1 = 1,  1 & 0 = 0, 0 & 1 = 0, 0 & 0 = 0。按位与简单的用法就是保留二进制中的指定位数,或者对数值进行清零操作。下方是按位与操作的小实例:0000_1111与1000_1011进行按位与运算,就是保留1000_1011的后四位。如果要对指定的二进制数进行清零的话,只需要把该值和0000_0000进行按位与操作即可。

    下方是上述代码中按位与的原理图:

    (2)按位或(|)

    顾名思义,按位或就是对二进制中的每一位进行或操作,所以叫按位或。运算规则为 1 | 1 = 1, 1 | 0 = 1,  0 | 1 = 1, 0 | 0 = 0。按位或常用来把指定位置的数值置为1。下方是实例是要把0000_0011的前四位置为1,后四位不变,所以要与1111_0000进行按位或操作。

    按位或操作的原理图如下:

    (3) 按位异或(^)

    异或的运算法则也是比较容易理解的, 简单一句话就是相同为0,不同为1。 1 ^ 1 = 0,  1 ^ 0 = 1,  0 ^ 1 = 1,  0 ^ 0 = 0。有异或的运算规则我们容易得出0 异或任何一个数,还等于这个数的本身。1 异或任何一个数等于这个数取反。下方是一个实例:

    上面代码的原理图如下:

    异或的用法是比较多的,我们可以使用异或运算在不创建临时变量时来交换两个数的值。具体如下:

    我们还可以使用异或运算来判断两个值是否相等,如果两个数异或后的值为0,那么两个数就相等,具体代码如下所示:

1 if swap1 ^ swap2 == 0 {2     print("swap1 == swap2")3 }

    (4) 按位取反(~)

      一个数值与1进行异或,都会得到其相反的值,也就是取反。我们还可以通过按位取反运算符来对值进行取反,取反的规则就比较简单了,就是0变成1,1变成0。下方是取反运算的实例,在Playground中可以看出其取反后的值。按位取反的实例如下(下面只讨论的正数的取反,关于负数的取反没有):

    (5) 按位左移(<<)和按位右移(>>)操作

      正数的左右位移用0来填补空位,而负数左移用0来填补,右移用符号位来填补。实例如下:

  2.溢出运算符

    在Swift语言中,如果值溢出,是会报错的。这也能反映出Swift安全性,如果你想在值溢出时对有效位进行截断的话,那么你就可以使用溢出运算符。

    值上溢出运算符(&+), 关于值上溢运算符,就不说多少废话了,直接上实例。在Playground中取出UInt8类型的上限,然后对其加1,让其溢出。如果你直接使用+号的话,会给出一个错误。使用&+就不一样了,效果如下。值的下溢运算符(&-, &*)的用法和&+类似,在此就不做赘述了。(&/与&%)在Xcode7中未编译通过,提示找不到此标示符。

  3. 运算符重载

    在Swift2.0中运算符重载是比较容易实现的,就是把函数名换成你要重载的运算符即可。下方就通过一个小实例来看一下Swift中的运算符重载。在Swift中是+号运算符是不支持元组直接相加的,如果你直接对元组进行加法操作,会报下面的错误。

    (1)对中缀运算符重载,如果对+运算符进行重载,那么+运算符将会支持元组相加, 具体代码和运行结果如下所示,+运算符原来的功能还是不变的。

    (2)对前缀运算符进行重载,就以-运算符为例。对前缀运算符重载在func前面要加上prefix修饰符。如果要对后缀运算符进行重载的话,要使用postfix进行修饰,下方是对-进行前缀运算符重载。具体代码如下:

 1 //前缀运算符重载 2 struct Point { 3     var x = 0.0, y = 0.0 4 } 5  6 prefix func - (point: Point) -> Point { 7     return Point(x: -point.x, y: -point.y) 8 } 9 let positive = Point(x: 3.0, y: 4.0)10 let negative = -positive

    结果输出如下:

    (3) 自定义运算符:在Swift中支持定义属于你自己的运算符,在定义运算符时,先使用operator 声明一下所指定的标示符,并且指定一下是前缀还是后缀等,具体的就看下面的代码即可:

//自定义运算符//1、先声明自定义的运算符prefix operator +++ {}//2.进行实现prefix func +++ (point:Point) -> Point{    return Point(x:point.x + 1, y:point.y + 1);
}

let aaa = Point(x: 1.0, y:2.0);
let add = +++aaa;
print(add)     // Point(x: 2.0, y: 3.0)

   

时间: 2024-08-05 15:21:04

Swift之需要注意的基本运算符和高级运算符的相关文章

iOS开发——swift篇&amp;经典语法(二十)高级运算符

高级运算符 除了基本操作符中所讲的运算符,Swift还有许多复杂的高级运算符,包括了C语和Objective-C中的位运算符和移位运算. 不同于C语言中的数值计算,Swift的数值计算默认是不可溢出的.溢出行为会被捕获并报告为错误.你是故意的?好吧,你可以使用Swift为你准备的另一套默认允许溢出的数值运算符,如可溢出加&+.所有允许溢出的运算符都是以&开始的. 自定义的结构,类和枚举,是否可以使用标准的运算符来定义操作?当然可以!在Swift中,你可以为你创建的所有类型定制运算符的操作.

窥探Swift2.0之需要注意的基本运算符和高级运算符

之前更新了一段时间有关Swift语言的博客,连续更新了有6.7篇的样子.期间间更新了一些iOS开发中SQLite.CollectionViewController以及ReactiveCocoa的一些东西.时隔两月,还得继续更新Swift语言的东西不是.在去年翻译<Swift编程入门经典>(Swift1.0版本,基于Xcode6)这本书时,系统的搞了搞Swift语言,接下来的一段时间内打算持续更新一下相关Swift语言的一些东西, 不过现在已经是Swift2.0版本了,区别还是不小的.并且目前在

Swift -- 语言指南--高级运算符

原文地址: http://www.cocoachina.com/ios/20140612/8794.html 除了基本操作符中所讲的运算符,Swift还有许多复杂的高级运算符,包括了C语和Objective-C中的位运算符和移位运算. 不同于C语言中的数值计算,Swift的数值计算默认是不可溢出的.溢出行为会被捕获并报告为错误.你是故意的?好吧,你可以使用Swift为你准备的另一套默认允许溢出的数值运算符,如可溢出加&+.所有允许溢出的运算符都是以&开始的. 自定义的结构,类和枚举,是否可

Swift 高级运算符

除了基本操作符中所讲的运算符,Swift还有许多复杂的高级运算符,包括了C语和Objective-C中的位运算符和移位运算. 不同于C语言中的数值计算,Swift的数值计算默认是不可溢出的.溢出行为会被捕获并报告为错误.你是故意的?好吧,你可以使用Swift为你准备的另一套默认允许溢出的数值运算符,如可溢出加&+.所有允许溢出的运算符都是以&开始的. 自定义的结构,类和枚举,是否可以使用标准的运算符来定义操作?当然可以!在Swift中,你可以为你创建的所有类型定制运算符的操作. 可定制的运

swift 笔记 (二十一) —— 高级运算符

高级运算符 位运算符 按位取反: ~ 按位与运算:  & 按位或运算:  | 按位异或运算:  ^ 按位左移运算: << 按位右移动算: >> 溢出运算符 自从swift里面提供了所谓的类型安全之后.我们就不能再用一个 Int.max 进行+1操作了,这样会导致报错.所以swift又提供了一个让我们在知道这会溢出的前提下,继续+1的溢出运算符,这听上去也不错. 溢出加法 &+ 溢出减法 &- 溢出乘法 &* 溢出除法 &/ 溢出取余 &

Swift4.2语言指南(二十八) 高级运算符

除了Basic Operators中描述的运算符之外,Swift还提供了几个执行更复杂值操作的高级运算符.这些包括C和Objective-C中您熟悉的所有按位和位移运算符. 与C中的算术运算符不同,Swift中的算术运算符默认不会溢出.溢出行为被捕获并报告为错误.要选择溢出行为,请使用Swift默认溢出的第二组算术运算符,例如溢出加法运算符(&+).所有这些溢出运算符都以&符号(&)开头. 定义自己的结构,类和枚举时,为这些自定义类型提供自己的标准Swift运算符实现会很有用.Sw

Java的算数运算符、关系运算符、逻辑运算符、位运算符

Java的运算符,分为四类:                           算数运算符.关系运算符.逻辑运算符.位运算符.                           算数运算符:+  -  *  /  %  ++  --                           关系运算符:==  !=  >  >=  <  <=                           逻辑运算符:&&  ||  !  ^  &  |        

shell运算符之 关系运算符,算数运算符,布尔运算符,字符串运算符和文件测试运算符

shell运算符有很多,关系运算符,算数运算符,布尔运算符,字符串运算符和文件测试运算符 1,算术运算符 原声bash 不支持简单的算术运算,可以使用expr 工具 两点注意: 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样. 完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边. #!/bin/basha=10b=20rst=`expr 2 + 2`echo '2+2 =' ${rst} rst=`exp

相等运算符==与等同运算符===

相等运算符==与等同运算符===,都可以用于判断数据是否相等,返回boolean类型的数据:==运算符做比较时,要求类型不一定相同,值通过数据类型转换之后相等即可.===运算符做比较时,要求类型必须相同,而且值也必须相同. ===运算符的条件: 1.如果运算数类型不相同,那么不等同: 2.如果运算数类型都是number,那么比较两个数值(任意一个为NaN,那么也不等同)是否等同: 3.如果运算数类型都是boolean,那么两个运算数都为true或false时就等同: 4.如果运算数类型都是对象类