swift 操作符

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。