Swift专题讲解二十三——高级运算符 一、引言 除了前边博客中介绍的基本运算符外,Swift中还支持更多高级运算符,也支持开发者进行运算符的自定义。Swift中的算符运算符有一个特点,其不会产生溢出,如果有操作产生溢出,程序会直接抛出异常。如果开发者在开发中需要有溢出操作,需要使用溢出操作符来实现。
二、位运算符 Swift支持C语言中的全部位运算符,示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 var a:UInt8 = 0b1000 a = ~a a = 0b11110000 &a a = 0b11111111 |a a = 0b11110000 ^a a = a<<1 a = a>>1
Swift中还提供了一种检查机制,当存在溢出操作时,程序会抛出异常,这样可以是开发者编写的代码更加安全,如果开发者真的需要使用溢出操作,Swift中还额外提供了支持溢出操作的运算符:
1 2 3 4 5 6 a = 255 &+ 1 a = a &- 1 a = a &* 2
三、重载运算符 运算符的重载是为原有的运算符增加新的功能,开发者可以自定义一些运算符函数来实现对具体类和结构体运算的功能,示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 class Circle { var point:(p1:Float,p2 :Float) var r:Float init(point:(Float,Float),r :Float){ self.point = point self.r = r } } func + (c1:Circle,c2 :Circle) -> Circle { return Circle(point: c1.point, r : c1.r+c2.r) }
上面代码演示的例子中重载了中缀运算符,即运算符是出现在两个操作数和中间的,还可以进行前缀运算符与后缀运算符的重载,使用prefix与postfix即可。示例如下:
1 2 3 prefix func + (c:Circle) -> Circle { return Circle(point: c.point, r : c.r*2 ) }
复合运算符也可以支持重载,需要注意的是,复合运算符的参数必须是inout修饰的,因为复合运算符会直接操作参数值:
1 2 3 func += (inout c1:Circle,c2 :Circle) { c1 = Circle(point: c1.point, r : c1.r+c2.r) }
等价运算符也可以用来重载,通常用来进行比较操作,示例如下:
1 2 3 4 5 6 func == (c1:Circle,c2 :Circle) -> Bool { return (c1.point==c2.point && c1.r==c2.r) } func != (c1:Circle,c2 :Circle) -> Bool { return ((c1.point != c2.point) || (c1.r != c2.r)) }
四、自定义运算符 Swift中除了可以对一些已经存在的运算符进行重载操作外,开发者还可以自定义一些运算符,在自定义运算符时,必须指定运算符是前缀、中缀或是后缀,示例如下:
1 2 3 4 5 6 7 //定义一个中缀运算符+!+ operator关键字用于定义运算符 infix operator +!+{} //进行运算符的实现 func +!+ (param:Int,param2:Int)->Int{ return (param+param2)*param2 } var b = 5 +!+ 5
还有一点需要注意,在进行自定义运算符时,开发者也可以为其设置结合性与优先级,结合性由associativity关键字定义,可选left,right,none,优先级的默认值为100,由precedence关键字指定,示例如下:
1 2 3 4 5 6 7 infix operator +!+{associativity left precedence 140 } func +!+ (param:Int,param2 :Int)->Int{ return (param+param2)*param2 } var b = 5 +!+ 5
专注技术,热爱生活,交流技术,也做朋友。
——珲少 QQ群:203317592