4.Swift教程翻译系列——Swift基本运算符[通俗易懂]

4.Swift教程翻译系列——Swift基本运算符

大家好,又见面了,我是全栈君。

英文版PDF下载地址http://download.csdn.net/detail/tsingheng/7480427

运算符是指一个特殊的符号,能够用来查看。更改值或者相加。比方说加法运算符+能够讲两个数字加起来。

另一些复杂的样例比方逻辑与&&或者自增++。Swift支持C中得大部分运算符,而且增加了一些增强的特性来降低代码中的错误。赋值预算符=不会返回值。这样就避免了在应该使用比較运算符==的地方误用=。数学运算符(加减乘除模)会做溢出推断,这样避免了值溢出的时候出现的奇怪现象。你能够选择使用Swift提供的溢出运算来同意溢出。非常后面的时候会有介绍。

Swift浮点数是能够进行求模运算的。C是不能够的。Swift还提供了范围符号(1..4和4…6)。

这张还是介绍一些通用的操作符,特殊操作符在后面Swift特殊操作符里面介绍。还会介绍怎么自己定义操作符或者为自己定义类实现操作符运算。

1.术语

运算符能够是一元、二元或者三元的。

  • 一元运算符仅仅对单个值进行操作。一元运算符通常都紧贴这操作对象。前后都有。

  • 二元运算符对像个值进行操作。一般出如今两个操作对象中间。
  • 三元运算符涉及三个对象,并且Swift语言里面仅仅有一个三元操作符。(a ? b: c)毫无疑问。

运算符影响的值叫运算元。

对于表达式1+2来说。加号(+)是个二元运算符,他的两个运算元各自是1跟2。

赋值运算符

赋值运算符(a = b)使用b的值来初始化或者更新a的值。

let b = 10
var a = 5
a = b
// a is now equal to 10

假设赋值运算符右边是个元组,元组中的值能够一次性被解析出来赋值给多个变量或常量。

let (x, y) = (1, 2)
// x is equal to 1, and y is equal to 2

跟C或者OC的赋值不一样的是,Swift的赋值运算不返回值。像以下这样就是错的

if x = y {
    // this is not valid, because x = y does not return a value
}

这个特性防止了该用==的地方使用=。编译器对if x= y报错。你就能避免这类错误了。

2.数学运算符

Swift提供四个标准数学运算符支持多有的数字类型。

加减乘除

1 + 2       // equals 3
5 - 3       // equals 2
2 * 3       // equals 6
10.0 / 2.5  // equals 4.0

可是默认情况下Swift数学运算符是不同意溢出的。

你能够通过溢出运算符来同意溢出比方说 a &+ b;

加号运算符还能用来连接字符串 比方”hello,” + “china”结果是“hello,china”。两个字符,或者一个字符跟一个字符串,都能相加得到字符串。(以下样例里面字符用的是表情符,不windows应该是不支持吧,我猜的。)

let dog: Character = "d"
let cow: Character = "c"
let dogCow = dog + cow
// dogCow is equal to "dc”

求余运算符

求余运算(a % b)是指a = n*b+c。n是整数,c要比b小,c就是结果。

NOTE 求余运算与其它语言里面的求模运算非常想。可是Swift里面求余还能够是负数,所以还是叫求余运算。

这里有个图示说明求余怎么回事。增加要计算9%4。首先要计算9里面能够放几个4:

4 4 1
1 2 3 4 5 6 7 8 9

9里面能够放得下2个4。剩下的就是1了。

要计算a%b的结果,%运算使用公式a = (b*someMultiplier) + remainder,而且用remainder作为返回值。someMultiplier是a中能容得下b的最大数量。带入上面的样例就是9 = (4*2) + 1

当a是负数的时候也是一样的方法。

-9%4 等于-1。代入公式就是 -9 = (4*-2)+(-1),结果是就是-1。假设b是负数的话。b的负号都会呗忽略,所以a%b和a%-b的结果总是一样的。

浮点数求余运算

Swift求余运算还能用于浮点数比方8%2.5结果是0.5。

实在太简单了又不好翻译这几句解说就算了。

自增和自减运算符

跟C一样。Swift提供了自增(++)和自减(–)运算符,用来方便的使某个值加1或者减1。这两个操作符能够用于整数或者浮点数。

var i = 0
++i //i等于1了

每次你调用++i的时候i的值都会加1。++i事实上就是i = i+1的缩写。一样的道理,–i就是i = i -1的缩写。

++和–既能用作前缀也能用作后缀。++i和i++都是正确地,–i和i–也是正确的(还用说吗,跟鸟哥一样啰嗦啊)

注意这两个操作符既改动i的值,最后还返回一个值,假设你仅仅是想改变i的值。能够忽略最后的返回值,可是当你要使用返回值的时候要注意前缀跟后缀的差别。

假设使用前缀,返回的是加1前的值,使用后缀返回的是加1后的值。比如

var a = 0
let b = ++a
// a and b are now both equal to 1
let c = a++
// a is now equal to 2, but c has been set to the pre-increment value of 1

上面这个样例中,let b = ++a先让a的值加1。然后才返回a的值。

也就解释了为什么a跟b的值都是1了。

可是let c = a++是先返回a的值然后才给a加1的。所以说这个完了以后a是2,而c等于1。

这里说建议尽量都是++i和–i的形式,我在JAVA里面都是写i++啊。

一元负运算符

数字的符号能够用-来改变。-就是个一元运算符

let three = 3
let minusThree = -three       // minusThree equals -3
let plusThree = -minusThree   // plusThree equals 3, or "minus minus three”

-直接放在操作对象的前面。中间不要有不论什么空格。

一元正运算符

+号运算符仅仅是返回操作对象的值,不会有不论什么改变。

let minusSix = -6
let alsoMinusSix = +minusSix  // alsoMinusSix equals -6

尽管说加号不错不论什么改变,可是假设你代码里给负数加负号,给正数加正号就显得对称多了。

复合赋值运算

Swift也提供了复合赋值运算。用来结合赋值运算符和其它的运算符。典型的样例就是+=了

var a = 1
a += 2
// a is now equal to 3

a += 2就是a = a+2的缩写。

两种方式仅仅是第一种将两个运算符结合到一起了。两种方式运行时间是一样的。

NOTE 复合运算符没有返回值。比方说不能使用let b = a+=2。

这个是跟自增自减运算不一样的地方。

3.比較运算符

Swift支持C全部的比較运算符,比較相等。比較不相等,大于,小于。大于等于,小于等于

NOTE Swift还提供了两个身份比較运算符===和。==,用来比較是两个对象的引用还是同一个对象的引用。

每一个比較运算符返回值都是Bool,表示这个表达式是不是正确的。

1 == 1   // true, because 1 is equal to 1
2 != 1   // true, because 2 is not equal to 1
2 > 1    // true, because 2 is greater than 1
1 < 2    // true, because 1 is less than 2
1 >= 1   // true, because 1 is greater than or equal to 1
2 <= 1   // false, because 2 is not less than or equal to 1

比較运算符通经常使用在条件语句中。比方if语句

let name = "world"
if name == "world" {
    println("hello, world")
} else {
    println("I'm sorry \(name), but I don't recognize you")
}
// prints "hello, world", because name is indeed equal to "world”

4.三元条件运算符

三元条件运算符是一种特殊的运算,由三个部分组成,形式是 question ?

answer1 : answer2。这是依据一个条件question是true还是false决定计算后面那个表达式。假设question是ture就计算answer1而且返回answer1的计算结果,假设是false就是answer2了。用代码表示就是这样:

if question {
    answer1
} else {
    answer2
}

以下有个样例,计算表格行的高度。

假设表格有表头。行高就要比内容高50px,假设没有表头,就比内容高20px:

let contentHeight = 40
let hasHeader = true
let rowHeight = contentHeight + (hasHeader ? 50 : 20)
// rowHeight is equal to 90

用if来写就是这种

let contentHeight = 40
let hasHeader = true
var rowHeight = contentHeight
if hasHeader {
    rowHeight = rowHeight + 50
} else {
    rowHeight = rowHeight + 20
}
// rowHeight is equal to 90

使用三元运算符的话设置行高仅仅要一行代码即可了。比后面用if的简单介绍多了。还不用把rowHeight定义成变量。由于在if里面根本不须要去改变rowHeight的值。

三元运算符提供了一种高效的方式来表达两选一的情况。

可是使用三元运算符的时候也要注意,假设太简洁了可能会减少代码的可读性。避免结合多个三元运算符搞成一条语句。

5.范围运算符

Swift提供两种范围运算符,用来表示数值范围

闭区间范围运算符

闭区间范围运算符(a…b)定义了从a到b得范围,而且包括a和b。当你要遍历某个范围而且须要范围里面每一个值都要用到的时候就能够用范围运算符了,比方for-in循环

for index in 1...5 {
    println("\(index) times 5 is \(index * 5)")
}
// 1 times 5 is 5
// 2 times 5 is 10
// 3 times 5 is 15
// 4 times 5 is 20
// 5 times 5 is 25

半闭范围运算符

半闭范围运算符(a..b)定义了从a到b包括a但不包括b的范围,之所以叫半闭范围运算符就是由于仅仅包括左边届不包括右边界。

半闭范围运算符对于遍历数组这样的下标从0開始可是不包括数组长度的遍历非常实用。

let names = ["Anna", "Alex", "Brian", "Jack"]
let count = names.count
for i in 0..count {
    println("Person \(i + 1) is called \(names[i])")
}
// Person 1 is called Anna
// Person 2 is called Alex
// Person 3 is called Brian
// Person 4 is called Jack

注意数组包括四项,可是0..count仅仅包括到3。

6.逻辑运算符

逻辑运算符能够改动或者结合逻辑值true和false。Swift支持三种标准的逻辑操作符 非(。),与(&&),或(||)

逻辑非运算符

逻辑非运算符取相反的结果,所以true变成false,flase变成true。

逻辑非运算符是前缀运算符,而且跟操作对象中间不同意有空格。

能够被读作“不是a”

let allowedEntry = false
if !allowedEntry {
    println("ACCESS DENIED")
}
// prints "ACCESS DENIED"

表达式if !allowedEntry能够被读作“假设不是同意进入”,if里面的代码仅仅有假设不是同意进入是真的时候才干运行。也就是假设同意进入是false的时候。

就像这个样例一样,给Boolean型变量或者常量取个好名字能保持代码整洁易读,尽量避免使用双重否定或者一些easy让人困惑的表达。

逻辑与操作符

对于逻辑与(a && b)操作符来说仅仅有a跟b都是true的时候他才返回true,否则返回false。

a跟b不论什么一个为false,整个表达式都是false,其实,假设a是false,b就不会再去计算了,由于没有必要啊。以下样例使用了两个bool值,而且仅仅有两个都为true的时候才干输出welcome

let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
    println("Welcome!")
} else {
    println("ACCESS DENIED")
}
// prints "ACCESS DENIED”

逻辑或运算符

对于逻辑或(a || b)来说。仅仅要a跟b有一个true,结果就反胃true。

跟逻辑与一样,假设a计算结果是true,就不会再去计算b的值直接返回true了。以下的样例一个Bool值是false,可是第二个是true,两个与计算之后还是true,所以if通过

let hasDoorKey = false
let knowsOverridePassword = true
if hasDoorKey || knowsOverridePassword {
    println("Welcome!")
} else {
    println("ACCESS DENIED")
}
// prints "Welcome!”

结合逻辑运算

你能够结合多个逻辑运算组成一个更长的复合语句

if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
    println("Welcome!")
} else {
    println("ACCESS DENIED")
}
// prints "Welcome!”

上面样例用了多个&&和||组成了一个有点儿长的复合表达式。可是&&和||还是仅仅能各自计算两个值,所以实际上是三个语句连在一起,能够解释成:

假设我们已经进入了正确的门且通过了视网膜扫描;或者假设我们有一张合法的门卡;或者假设我们认识解除紧急警报的password。那么就能够进入。

通过对值enteredDoorCode,passedRetinaScan和hasDoorKey的计算,前两个表达式的计算结果是false,可是我们知道解除警报状态的password。所以说整个表达式结果还是true。

7.明白的括号

有时候有些地方能够使用括号也能够不用括号。可是加上括号能让代码看起来更明了。

像上面的样例,给第一部分加上括号就非常实用了,代码的意图就非常清晰

if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {
    println("Welcome!")
} else {
    println("ACCESS DENIED")
}
// prints "Welcome!”

括号表明了第一个与运算的结果是总体结果的一个独立部分,加上括号不会影响表达式计算结果。可是总体意图变得更清晰易读了。可读性总是比简洁性要重要。

尽量用括号。

本章完。

下章地址5.Swift字符串和字符

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/116269.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 深度学习 arm linux移植过程整理[通俗易懂]

    深度学习 arm linux移植过程整理[通俗易懂]一、环境搭建下载虚拟机VMwareWorkstation自行下载激活成功教程下载ubtun因运行环境使用ubtun18所虚拟机下载的ubtun18下载比较慢的话可以更换国内镜像https://cn.ubuntu.com/download/server/step1vm中安装ubtun虚拟机https://zhuanlan.zhihu.com/p/141033713下载支持包编译服务器需要安装包makecmake交叉编译链arm-linux-gunebhf例如:ap

  • 至少使用两种方式运行pycharm_python还是java

    至少使用两种方式运行pycharm_python还是java要!!!下了pycharm但是没下载python也是运行不了的原文链接:Python环境搭建—安利Python小白的Python和Pycharm安装详细教程-知乎工欲善其事,必先利其器。首先我们先来安装Python,在这里安利一下:其实在没有安装Python之前也可以安装Pycharm的,两者并没有什么冲突关系。但是话说回来,如果没有Python编译器,那么Pycharm其实只是个驱壳,即便你编好程序之后,也并不能运行。举个栗子,Python相当于子弹,Pycharm相当于手枪,如果手

  • datagrip怎么安装(dg专业版注册码)

    !!!重点先上!!!今天在尝试使用DataGrip,第一次下载了最新的2018版本,后来发现注册码无法获取到(呵呵)。。。又迫于急切需要,对于非数据库开发人员,我觉得2017.2版本足够了(因为它刚好可以通过Licenseserver注册),所以就选择了这个版本!对于需要尝新使用更高版本的话,那就忽略本文的教程哈~1、下载2017.2版本(链接)2、安装后正常启动,进入填写注册码页面时,…

  • 解读Take-Two新财报:营收、利润增长均不及预期,游戏巨头如何迎来第二春?

    解读Take-Two新财报:营收、利润增长均不及预期,游戏巨头如何迎来第二春?5月14日,美国发行商Take-Two对外发布了2019财年第四季度的新财报。根据财报内容来看,Take-Two在营收、净利润等核心数据上保持了一定同比增速,但均没有超出市场期待。受财报发布后的影响,Take-Two的股价一度下跌超6%。回顾Take-Two前几个季度的财报来看,整体股价表现并不是很稳定,这也说明Take-Two的营收表现并没有让投资者很满意。随着全球游戏市场的竞争加剧,尤其是移…

  • busybox rootfs 与 ubuntu rootfs_boot.img root

    busybox rootfs 与 ubuntu rootfs_boot.img root下载busybox的源码,解压后,设定ARCH和CROSS_COMPILE的两个基本环境变量,选择defconfig作为默认配置,大部分的busybox工具都会被编译出来。如果不指定输出目录,默认输出到根目录的_install目录下面,如果需要指定目录,配置CONFIG_PREFIX=/a/b/c/rootfs,这样make生成的/bin,/sbin,/usr三个默认文件夹就直接在rootfs目录下。makeARCH=armCROSS_COMPILE=arm…

  • 数组splice方法的使用「建议收藏」

    数组splice方法的使用「建议收藏」数组splice方法是通过删除、替换现有元素、添加新的元素来修改数组的!

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号