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的类型 ...
随机推荐
- ASP入门(八)-Request对象
Request是ASP的耳朵,它可以获得客户端传递来的消息. BinaryRead方法和TotalBytes属性 用于以二进制方式读取客户端的请求,比如处理通过客户端上传文件时,通常使用这个方法来读取 ...
- js 判断l对象类型
var obj = {}; obj.isObject = function (obj) { return Object.prototype.toString.call(obj) == '[object ...
- C# .Net计算函数执行的时间
C#计算函数执行的时间 protected void StopwatchTest() { System.Diagnostics.Stopwatch stopwatch = new System.Dia ...
- LintCode: Restore IP Address
C++ string::substr(start_pos, length) vector::push_back(element) class Solution { public: vector< ...
- 关于extern "C"(详细剖析)
[目录] 引言 extern “C”的前世今生 小心门后的未知世界 Q&A c++调用c的方法 c调用c++的方法 在你工作过的系统里,不知能否看到类似下面的代码. 这好像没有什么问题,你应该 ...
- mktime 和 TZ
mktime底层使用__tz_convert,可能会比较慢 http://blog.csdn.net/aquester/article/details/54669264 http://blog.csd ...
- java 加密
加密.大体上分为双向加密和单向加密,而双向加密又分为对称加密和非对称加密. 双向加密大体意思就是明文加密后形成密文,能够通过算法还原成明文. 单向加密仅仅是对信息进行了摘要计算,不能通过算法生成明文. ...
- 神经网络:caffe特征可视化的代码例子
caffe特征可视化的代码例子 不少读者看了我前面两篇文章 总结一下用caffe跑图片数据的研究流程 deep learning实践经验总结2--准确率再次提升,到达0.8.再来总结一下 之后.想知道 ...
- java 判断是否为纯数字
java 判断是否为数字格式 CreateTime--2017年12月1日10:37:00 Author:Marydon java 判断是否为数字格式 /** * 判断是否为数字格式不限制位数 * ...
- 〖Android〗ant build android project, setting android.jar precedence
最近公司的一个项目中,新增了classes.jar包,与android.jar有冲突,必须得在加载android.jar前行加载classes.jar: 在持续集成环境中须使用ant编译,classe ...