swift 运算符
1.赋值运算符“=” 没有返回值, 比较运算符“==” 返回bool值。 这是swift比OC先进的地方。预防手误写错。
var a = 1
var b = 2
if a = b {
print("a == b") //直接就报错了, 会提示是不是要写==比较操作
}

let b = -4
print(9%4)// 1
print(9%b) //1
print(-9%4) //-1
2.Swift里算数运算符默认是不允许值溢出的。 保证代码和逻辑安全。 可以手动使用值溢出操作符,在算术运算符前面加&。 但是不建议。
3.合并控制运算符 ?? 实际上是一个三元运算符 a ?? b ===> a != nil ? a! : b 系统说前后两个变量类型必须一致,但是不一致也不报错。
let a: Int? = 9
let b = 4
print(a ?? b) //9
let c = "count"
print(a ?? c) //9
print(b ?? c) //4
4.区间运算符
闭区间 ... 半开半闭 ..< 单侧区间 2..., 2..< ...6, ..>6
注意:写这个区间运算符时,必须紧挨着常量,不可以有空格。
5.位运算
与& 或| 非! 异或^ 左移<<相当于翻倍 右移>> 相当于减半
交换两个数值
var a = 8, b = 6
a = a ^ b
b = a ^ b
a = a ^ b
print(a, b) // 6 8
6.运算符优先级和结合性 自定义运算符
struct Vector2D {
var x = 0
var y = 0
}
//重载运算符 函数前面必须加static 修饰。。。
extension Vector2D {
static func + (vec1: Vector2D, vec2: Vector2D) -> Vector2D {
return Vector2D(x: vec1.x + vec2.x, y: vec1.y + vec2.y)
}
}
//自定义一元运算符 必须在加前缀。 前缀运算符加prefix, 后缀运算符加postfix
extension Vector2D {
prefix static func - (vec: Vector2D) -> Vector2D {
return Vector2D(x: -vec.x, y: -vec.y)
}
}
//重载组合赋值运算符 需要将左参数设置为可修改的 inout 类型
extension Vector2D {
prefix static func += (left: inout Vector2D, right: Vector2D) -> Vector2D {
// return Vector2D(x: left.x += right.x, y: left.y += right.y)
left = left + right
}
}
自定义运算符
struct Vector2D {
var x = 0
var y = 0
}
//自定义一个翻倍运算符 ++
//1.声明运算符
prefix operator ++
extension Vector2D {
static prefix func ++(vec: Vector2D) -> Vector2D {
return Vector2D(x: vec.x * 2, y: vec.y * 2)
}
}
var vex = Vector2D(x: 3, y: 4)
print(++vex) // 6 8
//为类或结构体自定义运算符
//自定义一个中缀运算符 +-
//1.声明运算符, 指定优先级
infix operator +-: AdditionPrecedence
extension Vector2D {
static func +-(vec1: Vector2D, vec2: Vector2D) -> Vector2D {
Vector2D(x: vec1.x + vec2.x, y: vec1.y - vec2.y)
}
}
//自定义优先级的全新运算符
precedencegroup MyPrecedence {
associatedtype: left //指定结合性
lowerThan: AdditionPrecedence //指定优先级,这里指定比加法优先级低
}
infix operator +^+: MyPrecedence
extension Vector2D {
static func +^+(left: Vector2D, right: Vector2D) -> {
Vector2D(x: left.x + right.x * 2, y: left.y + right.y * 2)
}
}
//这样自定义一个+^+,比加法运算符优先级低的新运算符就完成了
网友评论