除了前邊博客中介紹的基本運算符外,Swift中還支持更多高級運算符,也支持開發者進行運算符的自定義。Swift中的算符運算符有一個特色,其不會產生溢出,若是有操做產生溢出,程序會直接拋出異常。若是開發者在開發中須要有溢出操做,須要使用溢出操做符來實現。javascript
Swift支持C語言中的所有位運算符,示例以下:java
//二進制數據8 實際上a = 00001000 8位 var a:UInt8 = 0b1000 //使用~ 進行按位取反運算 a = 0b11110111 247 a = ~a //使用& 進行按位與運算 a = 0b11110000 240 a = 0b11110000&a //使用|進行按位或運算 a=0b11111111 255 a = 0b11111111|a //使用^進行按位異或運算 a = 0b00001111 15 a = 0b11110000^a //使用<<進行按位左移運算 a = 0b00011110 30 a = a<<1 //使用>>進行按位右移運算 a = 0b00001111 a = a>>1
Swift中還提供了一種檢查機制,當存在溢出操做時,程序會拋出異常,這樣能夠是開發者編寫的代碼更加安全,若是開發者真的須要使用溢出操做,Swift中還額外提供了支持溢出操做的運算符:安全
//a = 255 + 1 這樣的運算會報錯 &+ 爲溢出加運算符 計算後a=0 a = 255 &+ 1 //&- 爲溢出減運算符 計算後 a = 255 a = a &- 1 //&* 爲溢出乘運算符 a = a &* 2
運算符的重載是爲原有的運算符增長新的功能,開發者能夠自定義一些運算符函數來實現對具體類和結構體運算的功能,示例以下:函數
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便可。示例以下:post
prefix func + (c:Circle) -> Circle { return Circle(point: c.point, r: c.r*2) }
複合運算符也能夠支持重載,須要注意的是,複合運算符的參數必須是inout修飾的,由於複合運算符會直接操做參數值:spa
func += (inout c1:Circle,c2:Circle) { c1 = Circle(point: c1.point, r: c1.r+c2.r) }
等價運算符也能夠用來重載,一般用來進行比較操做,示例以下:code
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中除了能夠對一些已經存在的運算符進行重載操做外,開發者還能夠自定義一些運算符,在自定義運算符時,必須指定運算符是前綴、中綴或是後綴,示例以下:ip
//定義一箇中綴運算符+!+ operator關鍵字用於定義運算符 infix operator +!+{} //進行運算符的實現 func +!+ (param:Int,param2:Int)->Int{ return (param+param2)*param2 } var b = 5 +!+ 5
還有一點須要注意,在進行自定義運算符時,開發者也能夠爲其設置結合性與優先級,結合性由associativity關鍵字定義,可選left,right,none,優先級的默認值爲100,由precedence關鍵字指定,示例以下:ci
//定義一箇中綴運算符+!+ infix operator +!+{associativity left precedence 140} //進行運算符的實現 func +!+ (param:Int,param2:Int)->Int{ return (param+param2)*param2 } var b = 5 +!+ 5
專一技術,熱愛生活,交流技術,也作朋友。開發
——琿少 QQ羣:203317592