-
算数运算符
-
关系运算符
-
逻辑运算符
-
位运算符
-
其他运算符
算数运算符
算数运算符有 一元运算符、 二元运算符、 算数赋值运算符
一元运算符
| 运算符 | 名称 | 说明 | 例子 |
|---|---|---|---|
| - | 取反符号 | 取反运算 | b=-a |
| ++ | 自加一 | 先取值再加一,或先加一再取值 | a++或++a |
| -- | 自减一 | 先取值再减一,或先减一再取值 | a--或--a |
注意:++,-- 在Swift3.0已经弃用。
var d = 1
d++ //报错,可以改写成 d += 1 或者 d = d + 1
二元运算符
| 运算符 | 名称 | 说明 | 例子 |
|---|---|---|---|
| + | 加 | 求a加b的和,还可以用于string类型,进行字符串连接操作 | a+b |
| - | 减 | 求a减b的差 | a-b |
| * | 乘 | 求a乘以b的积 | a*b |
| / | 除 | 求a除以b的商 | a/b |
| % | 取余 | 求a除以b的余数 | a%b |
算数赋值运算符
| 运算符 | 名称 | 例子 |
|---|---|---|
| += | 加赋值 | a+=b、a+=b+3 |
| -= | 减赋值 | a-=b |
| *= | 乘赋值 | a*=b |
| /= | 除赋值 | a/=b |
| %= | 取余赋值 | a%b |
关系运算符
| 运算符 | 名称 | 说明 | 例子 | 可应用的类型 |
|---|---|---|---|---|
| == | 等于 | a等于b时返回true,否则返回false。==与=的含义不同 | a==b | 整型、浮点型、字符、字符串、布尔型等值类型比较 |
| != | 不等于 | 与==恰恰相反 | a!=b | 整型、浮点型、字符、字符串、布尔型等值类型比较 |
| > | 大于 | a大于b时返回true,否则返回false | a>b | 整型、浮点型、字符、字符串 |
| < | 小于 | a小于b时返回true, 否则返回false | a<b | 整型、浮点型、字符、字符串 |
| >= | 大于等于 | a大于等于b时返回true, 否则返回false | a>=b | 整型、浮点型、字符、字符串 |
| <= | 小于等于 | a小于等于b时返回true, 否则返回false | a<=b | 整型、浮点型、字符、字符串 |
| === | 恒等于 | a与b同引用同一个实例时返回true, 否则返回false。===与==的含义不同。===是比较两个引用的内容是否为同一个实例 | a===b | 主要用于引用类型数据比较 |
| !== | 不恒等于 | 与===恰恰相反 | a!==b | 主要用于引用类型数据比较 |
**注:** 数据类型分为`值类型`和`引用数据类型`
值类型: 整数,浮点数,字符,字符串等数据类型
引用数据类型:类所声明的数据类型
如何选择正确的类型?
如果你想创建一个新类型,那么你应该选择值类型还是引用类型呢?当你使用Cocoa框架时,很多API都是NSObject的子类,那么你就必须要使用引用类型,也就是class。在其他情况下,这里有一些指导建议你可以参考:
使用值类型的情形:
- 使用==运算符比较实例数据的时候。
- 你想单独复制一份实例数据的时候。
- 当在多线程环境下操作数据的时候。
使用引用类型(比如class)的情形:
- 当使用===运算符判断两个对象是否引用同一个对象实例的时候。
- 当上下文需要创建一个共享的、可变的对象时。
在Swift中,Array、String、Dictionary都是值类型。它们的使用方式类似C语言中得int,每一个实例都有一份数据。你不需要进行显示的复制操作去防止数据在你不知情的情况下被修改。更重要的是,你可以跨线程进行传参而不需要考虑同步的问题,因为传递值类型很安全。秉着高安全性的精神,这种类型划分模式能帮助你在Swift中写出更加有可预测性的代码。
看看下面的代码
class Person {
var name : String
var age : Int
init (name : String, age : Int) {
self.name = name
self.age = age
}
}
let p1 = Person(name: "Tony", age: 18)
let p2 = Person(name: "Tom", age: 20)
if p1 === p2 {
print("p1 === p2")
}
let name1: NSString = "world"
let name2: NSString = "world"
if name2 === name1 {
print("name2 === name1")
}
p1和p2 是Person类的两个对象,属于引用数据类型
如果写成下面的样子会报错
image.png
name1和name2也属于引用数据类型,但是写成下面的样子不会报错
image.png
实际上是因为:name2与name1已经由NSString类型转变为了String类型。
解释:NSString类型与String类型有时候会发生无开销桥接过程,所谓无开销桥接过程就是我们可以把字符串String类型和NSString类型进行互相赋值,在进行赋值的过程中数据类型会发生转变,即类型由值类型(String类型)转变为引用数据类型(NSString类型)。
无开销不会产生额外的内存负担,而且过程是不知不觉的。
“苹果公司提供一种“零开销桥接技术” 使NSString和String互相转化更加低成本、更加简单 ”。
逻辑运算符
逻辑运算符
| 运算符 | 名称 | 例子 | 说明 | 可应用类型 |
|---|---|---|---|---|
| ! | 逻辑反 | !a | a为true时,值为false, a为false时,值为true | 布尔型 |
| && | 逻辑与 | a&&b | ab全为true,计算结果为true, 否则为false | 布尔型 |
11 |
逻辑或 | a11b | ab全为false时,计算结果为false, 否则为true | 布尔型 |
位运算符
位运算符
位运算是以二进位(bit)为单位进行运算的,操作数和结果都是整型数据。位运算符有如下几个运算符:&、|、^、~、>>、<<。
| 运算符 | 名称 | 例子 | 说明 |
|---|---|---|---|
| ~ | 位反 | ~x | 将x的值按位取反 |
| & | 位与 | x&y | x与y进行位与运算 |
| 1 | 位或 | x1y | x与y位进行位或运算 |
| ^ | 位异或 | x^y | x与y位进行位异或运算 |
| >> | 右移 | x>>a | x右移a位,无符号整数高位采用0补位,有符号整数高位采用符号位补位 |
| << | 左移 | x<<a | x左移a位,低位位补0 |
位异或:只要两个数相反结果就是1,否则为0
image.png
示例
let a: UInt8 = 0b10110010
let b: UInt8 = 0b01011110
print("a | b = \(a | b)") //11111110
print("a & b = \(a & b)") //00010010
print("a ^ b = \(a ^ b)") //11101100
print("~a = \(~a)") //01001101
print("a >> 2 = \(a >> 2)") //00101100
print("a << 2 = \(a << 2)") //11001000
let c: Int8 = -0b1100
//补全c: -00001100
print("c >> 2 = \(c >> 2)") //-00000011
print("c << 2 = \(c << 2)") //-00110000
其他运算符
- 三元运算符 (?:) 例如:x?y:z; 其中x、y和z都为表达式。
- 括号 起到改变表达式运算符顺序的作用,它的优先级最高。
- 引用号(.) 实例调用属性、方法等操作符。
- 赋值号 (=) 赋值是用等号运算符(=)进行的。
- 问号(?) 用来声明可选类型。
- 感叹号 (!) 对可选类型值进行显示拆包。
- is 判断某个实例是否为某种类型。
- as 强制类型转换。
- 箭头 (->) 说明函数或方法返回值类型。
- 逗号运算符(,) 用于集合分割元素。
- 冒号运算符 (:) 用于字典集合分割“键值”对。
示例
let score: UInt8 = 80
let result = score > 60 ? "及格" : "不及格" //三元运算符( ?: )
print(result)
var arr = [12, 56, 78, 89] //使用逗号运算符( , )
print(arr[2]) //下标运算符 ( [] )
var people = (name: "张三", age:20) // 使用冒号运算符( : )












网友评论