Swift-postfix 运算符
2019-07-31 本文已影响9人
Mccc_
内容:
1. 运算符作用位置的说明
// =运算符是中置运算符
var a = 0
// +=同样是中置
a += 1
// ++运算符是右置
a = a++
// --运算符是左置
a = --a
如何做到在左侧,中间还是右侧执行呢?
- 前置运算符:prefix
// 实现oc里面的 -- 运算
prefix func --(x: inout Int) {
x -= 1
}
var a = 3
--a
- 后置运算符:postfix
// 实现字符串的对可选值值的强解包崩溃处理
postfix func ~(str: String?) -> String {
return str == nil ? "" : str!
}
let optionalStr: String? = nil
let str1 = optionalStr~ // 为 “”
let str = optionalStr! // 崩溃
// 实现oc里面的++运算符
postfix func ++(x: inout Int) {
x += 1
}
var a = 0
a++
- 中间运算符:infix
//中间:计算N的M次方,左结合,优先级为255
infix operator ^^
func ^^(left: Double, right: Double) -> Double {
return pow(left, right)
}
print(2 ^^ 3) // 8.0
用以上三个不同的关键词修饰,可以在不同的位置起效果
2. 运算符的重载
对系统的运算符进行重新赋职能。
“=”是不可以进行重载的
struct Vector3 {
var x: Double = 0.0
var y: Double = 0.0
var z: Double = 0.0
func length() -> Double {
return sqrt(x * x + y * y + z * z)
}
}
// 重载乘号(*)
func *(left: Vector3, right: Vector3) -> Double {
return left.x * right.x + left.y * right.y + left.z * right.z
}
var vector3 = Vector3(x: 1, y: 2, z: 3)
var vector4 = Vector3(x: 2, y: 5, z: -3)
vector3 * vector4
3. 自定义运算符
除了标准运算符,Swift还可以声明和实现自定义运算符。
自定义运算符需要在全局作用域通过关键字operator进行定义,同时要指定prefix(前缀)、infix(中缀)或postfix(后缀)修饰符
prefix operator +++
自定义运算符仅能包含这些字符:/ = - + * % < >!& | ^。~