1.全局重载加号操作符(只能是方法,不可以是类方法,或是对象方法)
第一个参数是操作符前的,第二个参数是操作符后的
func +(left: Vector2D, right: Vector2D) -> Vector2D {
return Vector2D(x: left.x + right.x, y: left.y + right.y)
}
let v4 = v1 + v2
这里的Vector2D 可以是对象,也可以是结构体
2.定义新的操作符
示例1
/*
precedencegroup
定义了一个操作符优先级别。操作符优先级的定义和类型声明有些相似,一个操作符比需 要属于某个特定的优先级。Swift 标准库中已经定义了一些常用的运算优先级组,比如加法 优先级 ( AdditionPrecedence ) 和乘法优先级 ( MultiplicationPrecedence ) 等,你可以在这里找 到完整的列表。如果没有适合你的运算符的优先级组,你就需要像我们在例子中做得这 样,自己指定结合律方式和优先级顺序了。
associativity
定义了结合律,即如果多个同类的操作符顺序出现的计算顺序。比如常⻅的加法和减法都 是 left ,就是说多个加法同时出现时按照从左往右的顺序计算 (因为加法满足交换律,所 以这个顺序无所谓,但是减法的话计算顺序就很重要了)。点乘的结果是一个 Double ,不 再会和其他点乘结合使用,所以这里是 none ;
higherThan
运算的优先级,点积运算是优先于乘法运算的。除了 higherThan ,也支持使用 lowerThan 来指定优先级低于某个其他组。
infix
表示要定义的是一个中位操作符,即前后都是输入;其他的修饰子还包括 prefix 和 postfix ,不再赘述;
*/
precedencegroup DotProductPrecedence {
associativity: none
higherThan: MultiplicationPrecedence
}
infix operator +* : DotProductPrecedence
func +* (left: Vector2D, right: Vector2D) -> Double {
return left.x * right.x + left.y * right.y
}
let result = v1 +* v2
示例2
precedencegroup MatchPrecedence {
associativity: none
higherThan: DefaultPrecedence
}
infix operator =~: MatchPrecedence
func =~(lhs: String, rhs: String) -> Bool {
do {
let regex = try NSRegularExpression(pattern: rhs,options: .caseInsensitive)
return regex.matches(in: lhs,options: [],range: NSMakeRange(0, lhs.utf16.count)).count > 0
}catch _ {
return false
}
}
if "xxxxx@qq.com" =~ "^([a-z0-9_\\.-]+)@([\\da-z\\.-]+)\\.([a-z\\.]{2,6})$" {
print("有效的邮箱地址")
}
DotProductPrecedence,MatchPrecedence 被声明的自定义优先级
DefaultPrecedence没有关联性,并且优先级比TernaryPrecedence高
MultiplicationPrecedence是*,/的一级,的优先组 叫乘除优先组
Ternary Precedence 是 ?: 的一级,是比等号高的最低优先组 叫三元优先组
详情查看 操作符 Declarations