蘋果新的編程語言 Swift 語言進階(三)--基本運算和擴展運算

一 基本操做運算編程

一、 賦值操做安全

       在Swift 中,可以使用賦值操做爲一個常量或一個變量賦值,也可以使用多元組一次爲多個常量或變量賦值。函數

        Swift 的賦值操做與其餘語言最大的不一樣是賦值操做除了能夠爲變量或常量賦值外自己不能夠返回值。post

        這個特徵可以避免某些條件下賦值操做錯誤地用於相等比較操做。spa

        如在C語言中,if (x = =y) 很是easy誤寫做if (x = y) ,儘管邏輯結果不對,但C語言的編譯器卻沒法檢查出這樣的狀況,而Swift 語言卻可以有效避免這樣的狀況發生。因爲對象

        在Swift 中if (x = y)是無效錯誤的語句,Swift 規定賦值操做不能返回值。所以Swift 編譯器能夠檢查出這樣的錯誤,這也說明使用Swift語言編程能夠更加有效和安全。ci

 二、 算術操做編譯器

        Swift 語言對所有的數值類型支持標準的加減乘除(+-*/)四種基本算術操做。it

而Swift 語言相對C 和 Objective-C改善的地方是算術操做默認不一樣意溢出。io

固然你可以選擇使用和支持溢出操做。

3 、取餘操做(%)

       Swift 的取餘操做除了支持針對整數類型的取餘操做外,還支持對浮點數的取餘操做。

        如8 % 2.5   // equals 0.5

四、 比較操做

       Swift支持C語言提供的所有標準的比較操做。另外Swift還提供兩個同一操做符(===!==),用來測試比較兩個對象引用類型是否引用的是一樣的對象。

5 、邏輯操做

       Swift支持C語言標準的三個邏輯操做:非操做(!a)、與操做(a && b)、或操做(a || b)。

用來組合和改動布爾值。

6 、一元操做

       Swift支持C語言標準的++和--操做。

       另外Swift還提供減號操做,用來改變一個具備符號的數值類型的符號,如正數改變爲負號,負號改變爲正號。

      相對的還提供有加號操做,儘管加號操做不起不論什麼做用。

      也提供複合賦值操做(賦值操做和其餘操做的符合)。複合賦值操做也不支持返回值。

7 、三元操做

     Swift支持一個標準的C語言提供的三元操做:

   (question ? answer1 : answer2)。用來依據條件question的返回的布爾值的不一樣而返回不一樣的結果,即question爲true 返回answer1,不然answer2。

8 、範圍操做

      Swift包含兩個範圍操做符運算:一個閉合範圍操做(a...b),a和b都包含。一個半閉合範圍操做(a..b)。不包含b。

      範圍操做通常用於for-in 循環中,用於遍歷該範圍。

二 擴展操做運算

1 、位操做

        Swift 支持所有的C語言支持的位操做。包含位非() 、位與(&) 、位或(|) 、位異或(^)、位左移(<<)和位右移(>>) 等操做。

2 、溢出操做

        當試圖改動一個整數常量或變量的值超出該整數能夠保持的最大數或最小數時,Swift默認報告一個執行時錯誤。如一個整形Int16變量或常量的最大值爲32767。最小值爲-32768。假設設置Int16類型變量大於32767或小於-32768,則Swift默認報告一個執行時錯誤。

        如例如如下語句將報告一個執行時錯誤。

           varpotentialOverflow =Int16.max

          potentialOverflow += 1

    可是Swift也贊成用戶在溢出時選擇其餘溢出行爲,而不是默認報告一個錯誤。

         Swift對於整數運算提供5個能夠選擇溢出行爲的算術溢出操做,這些操做都以符號&開頭:溢出加(&+)、溢出減(&-)、溢出乘(&*)、溢出除(&/)、溢出取餘(&%)。

varwillOverflow =UInt8.max

willOverflow =willOverflow &+1
willOverflow =willOverflow &+1

// willOverflow is now equal to 0


        以上樣例所看到的,willOverflow變量在第一條語句被初始化爲一個八位整形(UInt8)值能夠保持的最大值(255),接着使用溢出加操做來使其加1。這將使變量willOverflow出現溢出。

然而計算結果不是報告一個執行時錯誤。而是恢復到該整形變量能夠保持的最小值0.

     其餘整形變量的溢出操做相同。

        總之對一個整形變量運行能夠形成上溢的溢出操做。溢出運算結果將從最大的有效值輪迴變成最小值。對某個整形變量運行溢出操做形成下溢,(如在一個初始值爲其最小值的整形變量上運行溢出減操做)。溢出運算結果將從最小值輪迴變成最大值。

varsignedUnderflow =Int8.min

// signedUnderflow 現在等於Int8整形的最小值是 -128

signedUnderflow =signedUnderflow &-1

// 在signedUnderflow 上運行溢出減一後結果變回Int8整形的最大值 爲127

      默認狀況,一個數運行除0(i / 0)或者零取餘(i % 0)操做將引發執行時錯誤。

可是對一個數執行溢出除0(i &/0)或者0溢出取餘(i & % 0)操做。結果爲0,而不出現錯誤。

3 、操做函數

           類和結構類型能夠定義本身的操做函數,來實現或覆蓋某些已經存在操做運算符操做。

           例如如下所看到的。在keywordfunc前面加入一個@infix屬性來聲明和定義一個二元加操做函數,來對Vector2D結構的實例運行加操做:

structVector2D {

    varx =0.0,y =0.0

}

@infixfunc + (left:Vector2D,right:Vector2D) ->Vector2D {

   returnVector2D(x:left.x +right.x,y:left.y +right.y)

}

            上面定義了一個全局的二元加操做函數。函數名爲「+」。函數輸入兩個類型爲Vector2D的參數,返回一個類型也是Vector2D的輸出值。

      該「+」函數的運行效果與一個標準的二元加操做類似,函數名稱+做爲定義的操做函數的二元操做符。兩個定義的命名爲left和right的輸入參數(表明Vector2D實例)做爲其二元操做數,函數運算結果返回一個新的Vector2D實例,其x和y屬性被初始化爲兩個輸入Vector2D實例的x和y屬性的對應加的結果。

      由於該定義的操做函數爲一個全局函數,而不是Vector2D 結構的方法。因此能夠對兩個存在的Vector2D實例進行二元加操做,例如如下所看到的。

letvector =Vector2D(x:3.0,y:1.0)

letanotherVector =Vector2D(x:2.0,y:4.0)

letcombinedVector =vector +anotherVector

     也可以爲類或結構類型定義相等操做(==)和不等操做(!=)兩個二元操做函數。也是使用二元操做屬性infix來標識,例如如下所看到的:

@infixfunc == (left:Vector2D,right:Vector2D) ->Bool {

    return (left.x == right.x) && (left.y == right.y)

}

@infixfunc != (left:Vector2D,right:Vector2D) ->Bool {

    return !(left ==right)

}


      相同,也能爲類或結構提供標準的一元運算符操做函數的實現。

      當你實現一個一元操做函數時。使用@prefix屬性來做爲其屬性,標識是一個一元前綴操做,使用@postfix屬性來定標識實現的是一個一元后綴操做。如:

@prefixfunc - (vector:Vector2D) ->Vector2D {

   returnVector2D(x: -vector.x,y: -vector.y)

}

      還能夠爲類或結構定義複合分配操做函數,一個複合分配操做函數使用@assignment屬性來標識。與其餘操做函數不一樣的是你必須標記複合分配操做函數的左輸入參數做爲inout類型,因爲該參數需要能夠在操做函數內被直接改動。

            例如如下樣例實現了一個爲Vector2D實例運行分配加操做的函數:

@assignmentfunc += (inoutleft:Vector2D,right:Vector2D) {

   left =left +right

}

 @assignment 屬性 還能夠與@prefix 或 @postfix屬性組合來定義其餘組合型一元操做。

例如如下爲Vector2D實例定義了一個一元‘++’操做函數。

@prefix@assignmentfunc ++ (inoutvector:Vector2D) ->Vector2D {

    vector +=Vector2D(x:1.0,y:1.0)

    returnvector

}

           需要注意的是不能給類或結構定義單獨的賦值操做(=),還有三元操做(a ?

b : c) 。


4 、定製操做

          除了實現Swift提供的標準的操做。Swift還支持用戶聲明和實現本身的定製操做符。

Swift支持的定製操做符名僅能從符號「/ = - + * % < > ! & | ^ . ~.」之間選擇。

          新的定製操做符使用operatorkeyword在全局級別聲明。並能夠聲明爲prefix,infixpostfix操做類型。例如如下定義了一個新的稱做「+++」的前綴操做:

       operatorprefix +++ {}

      在定義了新的操做符後。你就可以像Swift提供的標準操做符同樣使用,如爲結構或類定義新的操做函數,例如如下使用剛新定義的操做符實現了一個對Vector2D實例運行新操做符功能的操做函數。

@prefix@assignmentfunc +++ (inoutvector:Vector2D) ->Vector2D {

   vector +=vector

    returnvector

}

   上面對Vector2D 結構的+++實現,用來實現Vector2D實例自己的相加。

例如如下所看到的:

vartoBeDoubled =Vector2D(x:1.0,y:4.0)

letafterDoubling = +++toBeDoubled

// toBeDoubled now has values of (2.0, 8.0)

// afterDoubling also has values of (2.0, 8.0)


        Swift也能 爲 定製的二元操做符(Infix)指定相關的優先級和關聯性。假設不指定,默認的優先級爲100,關聯性爲none。例如如下定義了一個定製的二元操做符稱做’+-’,並指定左關聯,優先級爲140(和Swift提供的標準加二元運算符的設置一樣).

      operatorinfix +- {associativityleftprecedence140 }


                                                      版權所有,請轉載時註明連接和出處!

相關文章
相關標籤/搜索