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

一 基本操做運算編程

一、 賦值操做安全

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

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

        這個特徵能夠避免某些條件下賦值操做錯誤地用於相等比較操做。測試

        如在C語言中,if (x = =y) 很容易誤寫做if (x = y) ,雖然邏輯結果不正確,但C語言的編譯器卻沒法檢查出這種狀況,而Swift 語言卻能夠有效避免這種狀況發生,由於spa

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

 二、 算術操做ci

        Swift 語言對全部的數值類型支持標準的加減乘除(+-*/)四種基本算術操做。而Swift 語言相對C 和 Objective-C改善的地方是算術操做默認不容許溢出。固然你能夠選擇使用和支持溢出操做。編譯器

3 、取餘操做(%)it

       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 、操做函數

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

           以下所示,在關鍵字func前面添加一個@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支持的定製操做符名僅能從符號「/ = - + * % < > ! & | ^ . ~.」之間選擇。

          新的定製操做符使用operator關鍵字在全局級別聲明,並可以聲明爲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 }


                                                      版權全部,請轉載時註明連接和出處!

相關文章
相關標籤/搜索