在Swift中延伸了一種和C++類似的新特性,Swift的運算符提供了良好的可拓展性,我們可以對運算符進行操作,對運算符的操作其實就是對運算函數的重寫或者重載。注意運算符操作一般被操做的參數往往要加上In-Out模式。
我們在實際開發中,Swift可自定義運算符,並不限於預設的運算符,我們可以對+進行重載,使其完成Int與Double或者Flaot相加。
Swift提供了如下的函數,使得Int與Int可以相加:
func + (left:Int,right:Int)->Int{
return left+right
}
我們完全可以進行重構
func + (left:Int,right:Double)->Double
{
return Double(left)+right
}
實現+運算符對數組進行添加元素
func +(var left:[T],right:T)->[T]
{
left.append(right)
return left
}
經過實驗,貌似Swift不支持對 = 的重構
前面我們說的+以及沒有說的-是雙目運算符,而對於單目運算符,如++,–,Swift規定操作數放在單目運算符前面,這種運算符被稱為前置運算符,操作數放在單目運算符後面,這種運算符被稱為後置運算符。
prefix func ++ (operator:Type)->Type
{
let result=++operator
}
`前置運算符函數`
postfix func -- (operator:Type)->Type
{
let result=operator--
}
`後置運算符函數`
例子:
prefix func ++ (inout array:[T])->[T] {
array.append(array[array.count-1])
return array
}
var strArr=["iOS","Android","WP"]
print(++strArr)
在C語言中提供了+=賦值運算符,實際就是把第二個值相加給第一個值,這裡的第一個值就需要使用In-Out模式。
func += (inout left:[T],right:T)
{
left.append(right)
}
var myList=["iOS","Android"];
myList += "WP"
print(myList)
Swift中的Int、Double、String等類型都支持比較運算符,但如果自己定義的類型需要比較大小,則需要為自定義類型滿足如下兩個特征:
遵守Equatable、Comparable兩個協議。對自定義類型重載==和<兩個運算符。
只需要對自定義類型重載了==和<兩個運算符,Swift即可以自動推斷出!=、<=、>、>=這四種結果。
格式如下:
func <(las:Type,hrs:Type)->Bool
{
let result=lhs
例子
struct WXrect:Equatable,Comparable
{
var left:Double
var top:Double
var width:Double
var height:double
}
fun ==(las:WXrect,hrs:WXrect)->Bool
{
return lhs.width*lhs.height==rhs.width*rhs.height
}
fun < (las:WXrect,hrs:WXrect)->Bool
{
return ls.width`*`ls.height`<`rhs.width*rhs.height
}
let rect1=WXrect(left:2.0,top:3.0,width:5.0,height:4.0)
let rect2=WXrect(left:8.0,top:23.0,width:2.0,height:8.0)
letrect3=WXrect(left:7.0,top:3.0,width:10.0,height:10.0)
print(rect1rect2)
進階—開發自己的運算符
經過上邊的積累,我們已經掌握了運算符的操作,最後我們進行自己的運算符開發
兩步搞定一個自定義運算符
聲明 新的運算符。
格式如下:
prefix|infix|postfix operator 運算符名{}
prefix:代表前置運算符
infix:代表雙目運算符
postfix:代表後置運算符
為新的運算符提供多個重載的運算符函數
如果重載的運算符是前置運算符,則需要在func關鍵字添加prefix關鍵字
如果重載的運算符是後置運算符,則需要在func關鍵字添加postfix關鍵字
下面拋磚引玉的開發一個乘方運算符:**
由於乘法應該是雙目運算符,所以首先聲明新的運算符:**
infix operator **{}
為新的運算符提供重載函數
func ** (base:Int,exponent:Int)->Int
{
var result = 1
for _ in 1...exponent
{
result *= base
}
return result
}
let a=5
let b=3
print("\(a)的\(b)次方為:\(a ** b)")
怎樣?Swift強大吧!自己自定義運算符
下面我們看一道數學題
20+10-5*5*5*2-30
這道題怎麼做?我有些不會了!O(∩_∩)O哈哈~
這道數學題側面反映了運算符是有先後執行順序的,那麼我們自定義第運算符不應該也有運算規則呢!
結合性(associativity)的值可取的值有left,right和none。左結合運算符跟其他優先級相同的左結合運算符寫在一起時,會跟左邊的操作數結合。同理,右結合運算符會跟右邊的操作數結合。而非結合運算符不能跟其他相同優先級的運算符寫在一起。默認優先性為100
infix operator **= { associativity left precedence 140 }
fun ** (base:Int,exponent:Int)
{
}