苹果新的编程语言 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 }


                                                      版权所有,请转载时注明连接和出处!

相关文章
相关标签/搜索