Swift相比OC在運算符上做了一些改變, 但是基本的運算符,比如 +,-,*,/,%
, 邏輯運算符,比如 &&,||,!
, 還有三目運算符等也基本沒有變. 只是取消了自增++
, 自減--
.還有就是針對swift的可選類型的特點, 推出了??
運算符.
下面介紹一下Swift中的高級云算符, demo請點擊
溢出操作符 &+, &-, &*
溢出操作符在我們進行運算時,如果結(jié)果超出了容器范圍,會自行做容錯處理.例如:
var a :UInt8 = UInt8.max
var b = a
a &+ 1 //a為UInt8容器的最大值, 溢出后再從最小值開始, 所以結(jié)果為0
b += 1//編譯直接報錯,因為會溢出
操作符方法
很多時候我們需要給自定義的數(shù)據(jù)結(jié)構(gòu)或者類來定義一個操作符方法.比如向量的加減法
我們先定義如下一個結(jié)構(gòu)體, 后文中的所有自定義操作符都是根據(jù)這個結(jié)構(gòu)體來實現(xiàn)的.
struct Vector2D{
var x = 0.0, y = 0.0
}
自定義向量加法運算
extension Vector2D{
static func + (left:Vector2D, right:Vector2D) -> Vector2D {
return Vector2D(x: left.x + right.x, y: left.y + right.y)
}
}
let vec1 = Vector2D(x: 1, y: 2)
let vec2 = Vector2D(x: 3, y: 4)
//調(diào)用方式
vec1 + vec2
自定義向量的反向運算(只有一個操作數(shù)), 那么我們可以根據(jù)情況定義前置或者后置操作符(Prefix and postfix operators), 案例如下
//前置操作符
extension Vector2D {
static prefix func - (vector:Vector2D) -> Vector2D {
return Vector2D(x: -vector.x, y: -vector.y)
}
}
//調(diào)用方式
-vec1
以上是前置操作符(prefix)的定義和使用方式, 后置操作符(postfix)同理
聯(lián)合賦值操作符
聯(lián)合賦值操作符常見的就是 +=, -=
等.比如我們做向量的的+=
運算.
//賦值操作符+=
extension Vector2D {
static func += (left: inout Vector2D, right: Vector2D) {
//此處的` + `操作符是上面定義的
left = left + right
}
}
//調(diào)用方式
vec1 += vec2
等同性操作符
等同性操作符最常見的就是==, >=, <=
等, 通常系統(tǒng)很多類都能直接使用這些等同性操作符, 那是因為其遵循了 Equatable
協(xié)議, 所以是實現(xiàn)這個功能有兩種方式, 第一: 讓自定義的類或者結(jié)構(gòu)體遵循Equatable
協(xié)議; 第二: 自定義操作符.我們今天討論的是自定義操作符, 實現(xiàn)方法如下:
//等同性操作符
extension Vector2D {
static func == (left: Vector2D, right: Vector2D) -> Bool {
//此處調(diào)用的 == 是Float類型遵循 Equatable 協(xié)議中的函數(shù), 不是此處自定義的
return left.x == right.x && left.y == right.y
}
}
//調(diào)用方式
vec2 == vec1
自定義操作符
以上這些操作符都是系統(tǒng)實現(xiàn)過的, 而且這些操作符的關(guān)鍵字都是全局的, 我們雖然能自定義其行為, 但是也不是我們完全自定義的操作符.例如我們要定義一個++
(在Swift新版本中已經(jīng)移除了++, 和--, 要使用必須由開發(fā)者自定義)來實現(xiàn)自增運算.我們可以使用prefix, infix, postfix
幾個修飾符來限定操作數(shù)有幾個, 操作數(shù)在左邊還是在右邊.
自定義自增運算案例如下:
//告訴系統(tǒng)+++是一個后置操作符
postfix operator +++
extension Vector2D{
static postfix func +++ (vector: inout Vector2D) -> Vector2D {
return Vector2D(x: vector.x + 1, y: vector.y + 1)
}
}
//調(diào)用方式
vec2+++
操作符的優(yōu)先級
運算過程中, 優(yōu)先級非常重要, 同樣的算式, 優(yōu)先級不一樣,得到的結(jié)果會完全不同. 那么我們自定義的操作符如何規(guī)定其優(yōu)先級呢?
//和乘法同等優(yōu)先級
infix operator **: MultiplicationPrecedence
extension Vector2D {
static func ** (left: Vector2D, right: Vector2D) -> Vector2D {
return Vector2D(x: left.x * right.x, y: left.y * right.y)
}
}
vec1 + vec2 ** vec2
注意: 只有雙目運算符才能定義優(yōu)先級.