英文版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. 针对bootstrap内联单选框input与文字不能居中对齐的解决办法

    1.html代码 <div > <label class="checkbox-inline first-label"> <input type=&qu ...

  2. 【CodeVS】1204 寻找字串位置

    题目描述 Description 给出字符串a和字符串b,保证b是a的一个子串,请你输出b在a中第一次出现的位置. 输入描述 Input Description 仅一行包含两个字符串a和b 输出描述  ...

  3. centos install zookeeper cluster

    1.apache官方下载, 2.新版本需要jdk环境,然后配置好jdk环境 3.解压zookeeper,进入解压后的conf,新建zoo.cfg (删掉自带的cfg)内容如下 tickTime=200 ...

  4. FilenameFilter用法

    使用FilenameFilter实现图片过滤,只要.gif,.jpg,.png文件. java 代码 public class ImageFilter implements FilenameFilte ...

  5. Codeforces Gym 100342C Problem C. Painting Cottages 转化题意

    Problem C. Painting CottagesTime Limit: 2 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/10 ...

  6. SVN命令详解

    在开发中,除了在本机文件夹上进行svn更新外,在命令行中进行svn操作也非常关键,下面列举下网站摘抄的一些文档:1.将文件checkout到本地目录 svn checkout path(path是服务 ...

  7. Object-C 重载

    方法重载要保证三个条件 1在同一个类中 2.方法参数类型相同 名称相同 3.方法的参数不同 请看下面的例子 @interface whgMyObject : NSObject -(void)print ...

  8. DNA和纳米(Nano)Fusion技术的发展趋势

    细观国内外有关DNA与Nano技术的报道.不得不承认存在不小的差距,并且差距有继续拉大的趋势. 在我们国内,DNA技术是作为遗产基因来对待的.引用的有关中文參考资料一般比較陈旧.缺少參考价值.在发达国 ...

  9. SQL Server学习之路(七):Python3操作SQL Server数据库

    0.目录 1.前言 2.准备工作 3.简单测试语句 4.提交与回滚 5.封装成类的写法 1.前言 前面学完了SQL Server的基本语法,接下来学习如何在程序中使用sql,毕竟不能在程序中使用的话, ...

  10. Nginx 静态页面POST 请求提示405 Not Allowed

    从git上cp了一个开源的前端框架lay Ajax版本,用Nginx配置访问首页没问题 nginx配置如下: server { listen ; server_name adminhtml.com; ...