Swift 基本运算符
前言
- Swift 语言支持大部分标准 C 语言的运算符,并且改进了许多特性来使我们的代码更加规范,其中主要包含算数运算符、区间运算符、逻辑运算符、关系运算符、赋值运算符、自增自减运算符、溢出运算符等。
1、赋值运算符
Swift 使用符号
=来表示赋值运算,如果赋值的对象是一个元组,那么元组内成员的值在赋值操作中是一一对应的。=赋值Swift 赋值语句是没有返回值的,如果你使用如下语句系统会直接提示错误,避免开发人员犯将
==误写成=的设计性错误。if x = y {}
2、算数运算符
Swift 支持基本的加减乘除和求余运算。
+加
-减
*乘
/除
%求余Swift 中的加法运算
+除了可以用来对整数和浮点数做加法,还可以直接拼接字符串。Swift 中的求余运算
%可以对浮点数进行求余。求余运算中当参与运算的两个操作数符号不一致时,求余运算符结果的符号会和第一个操作数一致。
"bei jing" + " huan ying ni" // "bei jing huan ying ni"
5.1 % 2 // 1.1
-5 % 2 // -1
3、自增自减运算符
Swift 3.0 之前支持
++和--自增自减运算符,从 3.0 版本被废弃。3.0 之后使用自增自减运算可以使用下面的写法。+=自增
-=自减相比于
++和--,上面的写法还可以指定自增和自减的 “步长”。var a = 1 a += 1 // 自增,2
a -= 1 // 自减,0
4、组合赋值运算符
Swift 提供把其它运算符和赋值运算符组合在一起执行的运算。
+=加等于
-+减等于
*=乘等于
/=除等于
%=余等于要实现一个组合赋值符号需要把运算符的左参数设置成
inout类型,从而使运算符函数体内部可以直接修改他的值。func += (inout lhs: Int, rhs: Int) {
lhs = lhs + rhs
}
5、关系运算符
所有标准 C 中的比较运算符在 Swift 中都可以使用,比较运算会返回
Bool类型的比较结果。==等于
!=不等于
>大于
>=大于等于
<小于
<=小于等于
===恒等于
!==不恒等于恒等于运算符
===用于判断两个对象是否引用同一个类实例,在 Swift 中可以用在任何类型的比较中。原生的关系运算符
==或!=不能判断自定义的类型是否相等,需要重载。1 == 3 // false
1 != 3 // true
1 === 3 // false
1 !== 3 // true
6、条件运算符
条件运算符是
if-else结构的一种简化,它可以通过一个Bool类型判断条件的真假来选择执行哪个操作。判断条件 ? 表达式1 : 表达式2
如果判断条件表达式的值为真,则返回表达式 1 的值,否则返回表达式 2 的值。
var height = 180
var name = height > 160 ? "xiaoming" : "xiaogang" // "xiaoming"
7、逻辑运算符
Swift 沿用了 C 语言中的三种逻辑运算符 与、或、非,逻辑运算符的操作对象是布尔值。
&&与
||或
!非逻辑与
&&运算,如果第一个值为false,表达式将直接返回false,而不会去计算第二个操作数,这种机制被称为 “短路计算”。逻辑或
||运算,如果第一个值为true,表达式将直接返回true,而不会去计算第二个操作数。逻辑非
!运算,运算符与操作数之间不能有空格。
8、位运算符
Swift 中可以使用所有和 C 语言一样的位运算符。
&按位与
|按位或
~按位取反
^按位异或
<<按位左移
>>按位右移按位左移相当于把这个数乘以 2 的因子。
按位右移相当于把这个数除以 2 的因子。
对于无符号数按位右移时,被移出整型存储边界的低位将被直接抛弃,而右移留下的高位空白位用 0 来填充,这种机制称为 “逻辑移位”。
对于有符号数按位右移时,高位不足时会使用符号位(正数位 0,负数为 1)填充空白位,这种机制被称为 “算数移位”。
9、溢出运算符
Swift 为整型计算提供了 5 个
&符号开头的溢出运算符。&+溢出加法
&-溢出减法
&*溢出乘法
&/溢出除法
&%溢出求余Swift 语言中的数值运算默认是不可以值溢出的,但是在某些特定的场合一定需要使用值溢出时,可以使用溢出运算来达到有目的的溢出。
var intMaxNum = Int8.max &+ 1 // -128 值溢出被截断
var intMinNum = Int8.min &- 1 // 127 值溢出被截断
10、单目正负号运算符
我们通常使用单目负号
-来切换数值类型的正负。-负号
+正号单目正负号运算符通常用于切换值类型的正负,单目正负运算符与操作数之间不能有空格。
var i = 2
var b = -i // -2
11、连接运算符
两个字符串可以连接在一起成为一个新字符串,这种操作被称为字符串连接,在 Swift 中连接字符串可以使用
+符号。+连接
12、区间运算符
在 OC 中,我们可以使用 Range 函数来指示一个起始位置和长度,从而恒定一个范围。Swift 中的范围使用起来要方便的多。
a...b闭区间
a..<b半闭区间闭区间
a...b定义一个包含从 a 到 b(包括 a 和 b)范围内所有值的空间。半闭区间
a..<b定义一个包含从 a 到 b(包括 a,不包括 b)范围内所有值的空间。
13、自定义运算符
自定义运算符是新的编程语言才支持的特性,不同于组合赋值运算符,你可以使用
/ = - + * % < > ! & | ^ ~来组合构成新的运算符。自定义一个运算符通常需要先声明再实现其功能,声明自定义的运算符需要使用
operator关键字。operator :表示要进行运算符重载。 infix :表示这是一个二元运算符,操作符在两个操作数中间。
prefix :表示这是一个一元运算符,操作符在操作数前边。
postfix :表示这是一个一元运算符,操作符在操作数后边。 associativity :结合性,包含 left(左结合)、right(右结合)和 none(自动),默认值为 none。 precedence :优先级,默认为 100,可省略。
自定义运算符
<>// 声明自定义运算符 <>
infix operator <> {associativity none precedence 100} // 实现自定义的运算符 <>
func <> (lhs: Int, rhs: Int) -> Int { return (lhs + rhs) * (lhs - rhs)
} // 输出值等于 20
let n1 = 6
let n2 = 4
let value = n1 <> n2
print(value)
14、运算符重载
让已有的运算符对自定义的类和结构进行运算或者重新定义已有运算符的运算规则,这种机制被称为 “运算符重载”。
运算符重载可以使同一个运算符在处理不同数据类型时,实现的是不同的功能。
默认的赋值符
=和三目条件运算符? :是不可重载的。Swift 语言和其他高级语言不同,其原生的关系运算符不能判断自定义的类型是否相等,所以我们需要重载自定义的类和结构的比较符
==或!=。func == (left: CenterPointer, right: CenterPointer) -> Bool {
return (left.x == right.x) && (left.y == right.y)
} func != (left: CenterPointer, right: CenterPointer) -> Bool {
return !(left == right)
}
15、运算符优先级和结合性
运算符的优先级使得一些运算符优先于其他运算符,从而使得高优先级的运算符会先被计算。
运算符的结合性用于定义相同优先级的运算符在一起时和表达式结合或关联的规则。
结合性(associativity)包含 left(左结合)、right(右结合)和 none(自动),结合性的默认值为 none。优先级( precedence )默认为 100。
// 指定运算符的优先级和结合性 左结合 优先级 140
infix operator +- {associativity left precedence 140}
运算符优先级和结合性
运算符 | 名称 | 结合性 | 优先级
---------|-----------------|-------------|-------------
<< | 按位左移 | 无 | 160
>> | 按位右移 | 无 | 160
* | 乘 | 左 | 150
/ | 除 | 左 | 150
% | 求余 | 左 | 150
&* | 忽略溢出乘 | 左 | 150
&/ | 忽略溢出除 | 左 | 150
&% | 忽略溢出求余 | 左 | 150
& | 按位与 | 左 | 150
+ | 加 | 左 | 140
- | 减 | 左 | 140
&+ | 溢出加 | 左 | 140
&- | 溢出减 | 左 | 140
| | 按位或 | 左 | 140
^ | 按位异或 | 左 | 140
.. | 半闭区间 | 无 | 135
... | 全闭区间 | 无 | 135
is | 类型检查 | 无 | 132
as | 类型转换 | 无 | 132
< | 小于 | 无 | 130
<= | 小于等于 | 无 | 130
> | 大于 | 无 | 130
>= | 大于等于 | 无 | 130
== | 等于 | 无 | 130
!= | 不等于 | 无 | 130
=== | 恒等于 | 无 | 130
!== | 不恒等于 | 无 | 130
~= | 模式匹配 | 无 | 130
&& | 逻辑与 | 左 | 120
|| | 逻辑或 | 左 | 110
? : | 条件 | 右 | 100
= | 赋值 | 右 | 90
*= | 复合乘赋值 | 右 | 90
/= | 复合除赋值 | 右 | 90
%= | 复合求余赋值 | 右 | 90
+= | 复合加赋值 | 右 | 90
-= | 复合减赋值 | 右 | 90
<<= | 复合按位左移赋值 | 右 | 90
>>= | 复合按位右移赋值 | 右 | 90
&= | 复合按位与赋值 | 右 | 90
^= | 复合按位异或赋值 | 右 | 90
|= | 复合按位或赋值 | 右 | 90
&&= | 复合逻辑与赋值 | 右 | 90
||= | 复合逻辑或赋值 | 右 | 90
Swift 基本运算符的更多相关文章
- 4.Swift教程翻译系列——Swift基本运算符
英文版PDF下载地址http://download.csdn.net/detail/tsingheng/7480427 运算符是指一个特殊的符号,能够用来查看.更改值或者相加.比方说加法运算符+能够讲 ...
- swift的运算符
1.什么是运算符?它有什么作用? 运算符是一种特定的符号或者表达式.它用来验证.修改.合并变量. 2.运算符有哪些? 运算符有很多,很多朋友学的很烦.这里我依据它的作用把它分为几块来介绍: a:赋值运 ...
- 1. Swift基本变量|运算符|控制流
Swift基于cocoa Touch框架,苹果官方为了保证Swift的可靠性,结合多种语言的特性,同时独立了一套属于自己的单独语言,结合了C,C++,OC,Java等语言. 基本变量: 1 . swi ...
- 初学swift笔记运算符(二)
swift 中的运算符 import Foundation //字符类型 var char: Character = "a" char="b" println( ...
- Swift - 高级运算符介绍
除了基本运算符之外,Swift还支持位运算和位移运算,包括: 1,按位取反运算:操作符是 ~ 2,按位与运算:操作符是 & 3,按位或运算:操作符是 | 4,按位异或运算:操作符是 ^ 5 ...
- Swift区间运算符
Swift 提供了两个方便表达一个区间的值的运算符. 闭区间运算符 闭区间运算符(a...b)定义一个包含从a到b(包括a和b)的所有值的区间. 闭区间运算符在迭代一个区间的所有值时是非常有用的, ...
- Swift 高级运算符
本文转载至 http://my.oschina.net/sunqichao/blog?disp=2&catalog=0&sort=time&p=2 除了基本操作符中所讲的运算符 ...
- swift基础--运算符
(1)加减乘除 (2)三目运算,切记后面的空格如果不加会报错的.估计是苹果的bug. (3)聚合运算符,省却了一个判断,很人性化 (4)区间运算符 //加减乘除等等 let a = 2 let b = ...
- swift基本运算符
一.空合运算符(Nil Coalescing Operator) 形式:a??b,如果a包含值则解封,否则返回默认值b 条件:a必须为optional类型,这个就不多说了,就是可选类型:默认值b的类型 ...
随机推荐
- Andriod NDK assets的三个相关知识
如何获取assetManager engine->app->activity->assetManager Asset文件应该放在哪个目录? 如何生成tga文件: 可以用这 ...
- 无法从“void (__thiscall CtestDlg::* )(void)”转换为“LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)”
按照孙鑫的教程添加自定义消息时,如果是VC6.0开发环境,也许没有什么 问题,但在VS2008中编译会报错的 无法从"void (__thiscall CtestDlg::* )(voi ...
- 启动项目时出现Not a JAR.......Find JAR........一指循环就是起不来
出现问题原因就是mapper的映射文件有问题,里面的返回类型如是实体找不到或者找重复的就会这样 解决办法就是:确保在用的实体(路径)能找到,切记不能有重名的实体
- Solr搭建真实项目
在经过solr5.4.1 quick start 的学习后.我们要搭建真实的项目了 1.启动项目 bin/solr start 2.创建core bin/solr create -c pms 3.为 ...
- ivr
/************************************************************* 北京高阳圣思园信息技术有限公司IVR业务: 流程说明:公司介绍子流程 发布 ...
- Android 模仿微信启动动画
本文内容 环境 项目结构 演示微信启动动画 本文演示微信启动动画.请点击此处下载,自行调试. 顺便抱怨一下,实践性(与研究性质的相对)技术博的"七宗罪": 第一宗罪,错字连篇,逻辑 ...
- C#.NET常见问题(FAQ)-如何使用变量访问控件属性
不管哪种类型的控件,可以用下面这种强制转换和Controls.Find的方法来读写控件的属性 //我在界面上做了三个picturebox控件 PictureBox p; //注意索引必须从1开始,并且 ...
- 通过httpclient3实现文件下载以及获取文件下载名称
package httpclient3test; import java.io.File; import java.io.FileNotFoundException; import java.io.F ...
- Storm本地模式异常
来自:http://isuifengfei.iteye.com/blog/1998265 问题1 java.net.SocketException: Address family not supp ...
- sell 项目 订单详情表 设计 及 创建
1.数据库设计 2.订单详情表 创建 /** * 订单详情表 */ create table `order_detail` ( `detail_id` varchar(32) not null, `o ...