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字符串和字符
4.Swift教程翻译系列——Swift基本运算符的更多相关文章
- 2.Swift教程翻译系列——Swift概览
英文版PDF下载地址http://download.csdn.net/detail/tsingheng/7480427 依照传统学习程序语言都是从hello,world開始,在Swfit里面仅仅须要一 ...
- 5.Swift教程翻译系列——Swift字符串和字符
英文版PDF下载地址http://download.csdn.net/detail/tsingheng/7480427 字符串是一组字符的有序序列,比方"hello,china"或 ...
- 6.Swift教程翻译系列——Swift集合类型
英文版PDF下载地址http://download.csdn.net/detail/tsingheng/7480427 Swift提供数组和字典两种集合类型.用来存储很多值的情况.数组有序的存储一组同 ...
- 1.Swift教程翻译系列——关于Swift
英文版PDF下载地址http://download.csdn.net/detail/tsingheng/7480427 我本来是做JAVA的.可是有一颗折腾的心,苹果公布Swift以后就下载了苹果的开 ...
- 8.Swift教程翻译系列——控制流之条件
3.条件语句 常常会须要依据不同的情况来运行不同的代码. 你可能想要在错误发生的时候运行一段额外的代码,或者当某个值变得太高或者太低的时候给他输出出来.要实现这些需求,你能够使用条件分支. Swift ...
- 中文版 Apple 官方 Swift 教程《The Swift Programming Language》
简介 欢迎使用 Swift 关于 Swift 版本兼容性 Swift 初见 Swift 版本历史记录 Swift 教程 基础部分 基本运算符 字符串和字符 集合类型 控制流 函数 闭包 枚举 类和结构 ...
- Entity Framework教程翻译 ---- 系列教程
Entity Framework教程(第二版) (翻译)Entity Framework技巧系列之十四 - Tip 56 (翻译)Entity Framework技巧系列之十三 - Tip 51 - ...
- RHadoop教程翻译系列 _Mapreduce(1)_第一个Mapreduce任务
如果单从概念上来说,Mapreduce和R中的函数lapply, tapply并无差别,它们都是把元素转化成列,然后计算索引(Mapreduce中的键),最后合并成一个定义好的组合.首先,让我们看一个 ...
- Swift教程之运算符重载
http://blog.csdn.net/mengxiangyue/article/details/43437797 原文地址:http://www.raywenderlich.com/80818/o ...
随机推荐
- javascript入门视频第一天 小案例制作 零基础开始学习javascript
JavaScript 是我们网页设计师必备的技能之一.我们主要用javascript来写的是网页特效.我们从零基础开始学习javascript入门. 但是,好的同学刚开始不知道怎么学习,接触js,因此 ...
- springmvc-3.2-jsr303解决服务端验证问题
从以前的验证:Stringutils.isEmpty....到struts的验证:xxxvalidate 现在使用jsr303使之更加简单 依赖hibernate-validator-4.xx.ja ...
- linux ubuntu安装jdk
Oracle对Jdk7与Jre7的关系的经典图解 Oracle has two products that implement Java Platform Standard Edition(Java ...
- 利用MySQL 的GROUP_CONCAT函数实现聚合乘法
MySQL 聚合函数里面提供了加,平均数.最小,最大等,可是没有提供乘法,我们这里来利用MYSQL现有的GROUP_CONCAT函数实现聚合乘法. 先创建一张演示样例表: CREATE TABLE ` ...
- 关于Cocos2d-x 3.0正式版 粒子问题在IOS上正常显示,在Android下有问题的解决方式
前几个在Cocos2d-x论坛上,有人提到粒子系统的问题..这里列举一下解决的方法: 或许到时候大家用粒子效果的时候也会发现这个问题,如今把这个问题的解决办法说出来.至于原因我也不知道是引擎的问题还是 ...
- Arcgis镶嵌数据集java代码操作
转自:http://www.cdtarena.com/javapx/201307/9105.html 镶嵌数据集结合了之前arcgis管理影像的栅格目录和栅格数据集,为解决海量影像管理提供了很好的方案 ...
- 利用opencv中的级联分类器进行人脸检測-opencv学习(1)
OpenCV支持的目标检測的方法是利用样本的Haar特征进行的分类器训练,得到的级联boosted分类器(Cascade Classification).注意,新版本号的C++接口除了Haar特征以外 ...
- [置顶] Hibernate从入门到精通(七)多对一单向关联映射
上次的博文Hibernate从入门到精通(六)一对一双向关联映射中我们介绍了一下一对一双向关联映射,本次博文我们讲解一下多对一关联映射 多对一单向关联映射 多对一关联映射与一对一关联映射类似,只是在多 ...
- java 一个函数EnumMap返回多个值
java 一个函数如何返回多个值 在开发过程中,经常会有这种情况,就是一个函数需要返回多个值,这是一个问题!! 网上这个问题的解决方法: 1.使用map返回值:这个方法问题是,你并不知道如何返回值 ...
- Recipes — Bottle 0.13-dev documentation
Recipes - Bottle 0.13-dev documentation Recipes¶ This is a collection of code snippets and examples ...