英文版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基本运算符的更多相关文章

  1. RHadoop教程翻译系列 _Mapreduce(1)_第一个Mapreduce任务

    如果单从概念上来说,Mapreduce和R中的函数lapply, tapply并无差别,它们都是把元素转化成列,然后计算索引(Mapreduce中的键),最后合并成一个定义好的组合.首先,让我们看一个 ...

  2. Swift中文教程 第2章 基本运算符 (20140604更新)

    今天我在下午又进行了新的翻译,之前我翻译的大家有没有看啊,感觉如何,我昨天下午不小心点了什么原先的文章都没了,大家的评论也没了,现在我也找不回来了,希望大家能继续给我新的评论和支持点个推荐,毕竟现在学 ...

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

    之前更新了一段时间有关Swift语言的博客,连续更新了有6.7篇的样子.期间间更新了一些iOS开发中SQLite.CollectionViewController以及ReactiveCocoa的一些东 ...

  4. apple Swift教程大全,希望对你有帮助!

    1)apple Swift编程入门文档- http://gashero.iteye.com/blog/2075324 一位大神写的关于Swift的一些介绍和简单的使用,里面介绍了Swift和其他语言的 ...

  5. iOS开发系列--Swift进阶

    概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...

  6. Swift翻译之-Swift语法入门 Swift语法介绍

    目录[-] Hello world - Swift 简单赋值 控制流 函数与闭包 对象和类 枚举与结构 协议和扩展 泛型 2014.6.3日,苹果公布最新编程语言Swift,Swift是一种新的编程语 ...

  7. swift学习(二)--基本运算符、字符串、集合操作

    在这一篇博客里面,我想要介绍一下swift里面一些常用的基本运算符,还有涉及到的字符串,集合操作.你会发现在swift里面还是有许多其他语言所不具有的特性运算操作的. 首先最基本的+,-,*,/,&g ...

  8. iOS开发系列--Swift 3.0

    概述 从写第一篇Swift文章的时候到现在Swift已经从1.2发展到了今天的3.0,这期间由于Swift目前还在发展阶段并不能向下兼容,因此第一篇文章中的部分代码在当前的Xcode环境中已经无法运行 ...

  9. [翻译]理解Swift中的Optional

    原文出处:Understanding Optionals in Swift 苹果新的Swift编程语言带来了一些新的技巧,能使软件开发比以往更方便.更安全.然而,一个很有力的特性Optional,在你 ...

随机推荐

  1. JavaScript跨域提交数据

    1.通过jsonp跨域    场景:假设前台有JS方法"crossJS", 1.1发送请求http://www.xxx.com/?callback=crossJS.(创建一个scr ...

  2. 减少生成的dll数量

    在开篇之前我想鄙视我自己一下,这个东西根本不需要去写,本来已经有东西去实现了,正如我组长说我的,看的开源项目太少了.其实这个东西完全可以用ILMerge来解决. 然后再说说前言,开发东西久了,总会积累 ...

  3. [Python] Python学习笔记之常用模块总结[持续更新...]

    作为一种极其简单的编程语言,Python目前成为了最炙手可热的几种语言之一.它不仅简单易学,而且它还为用户提供了各种各样的模块,功能强大,无所不能.有利必有弊,学习Python同样有困扰,其中之一就是 ...

  4. oracle中SET DEFINE意思

    et define off关闭替代变量功能 在SQL*Plus中默认的"&"表示替代变量,也就是说,只要在命令中出现该符 号,SQL*Plus就会要你输入替代值.这就意味着 ...

  5. RNN 入门教程 Part 2 – 使用 numpy 和 theano 分别实现RNN模型

    转载 - Recurrent Neural Networks Tutorial, Part 2 – Implementing a RNN with Python, Numpy and Theano 本 ...

  6. Crypto++ 动态链接编译与实例测试

    测试用例的来源<Crypto++入门学习笔记(DES.AES.RSA.SHA-256)> 解决在初始化加密器对象时触发异常的问题: CryptoPP::AESEncryption aesE ...

  7. Java 上传文件到 SFTP 抛异常 java.lang.NoClassDefFoundError: Could not initialize class sun.security.ec.SunEC 的解决办法

    最近从 Op 那里报来一个问题,说是SFTP上传文件不成功.拿到的 Exception 如下: Caused by: java.lang.NoClassDefFoundError: Could not ...

  8. centos6.5没有eth0, 只有eth1, eth1无法上网

    1. cat  /etc/udev/rules.d/70-persistent-net/rules 2.将ATTR(address)=XXXXXXXX的内容 替换  文件/etc/sysconfig/ ...

  9. 第二百二十四天 how can I 坚持

    实物商品兑换,有点小难搞,其实也没什么难的,也就那些东西,不过好像这就是我设计实现的,干起来挺来劲的. 供暖了,挺暖和的,哈哈. 小米耳机(炫彩版)到了.感觉挺好的. 还在纠结到底要买哪种颜色的羽绒服 ...

  10. 数据库自定义表值函数Split(@LongStr, @SplitStr, @IsDistinct )

    CREATE FUNCTION [dbo].[F3_Split](@LongStr VARCHAR(MAX),@SplitStr VARCHAR(100),@IsDistinct BIT)RETURN ...