程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Swift 運算符操作(和C++類似的新特性)

Swift 運算符操作(和C++類似的新特性)

編輯:C++入門知識

Swift 運算符操作(和C++類似的新特性)


在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關鍵字修飾,重置後置運算符必須使用postfix關鍵字修飾。

    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)
 {

}
   

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved