苹果新的编程语言 Swift 语言进阶(三)--基本运算和扩展运算

一 基本操作运算

1、 赋值操作

       在Swift 中,可以使用赋值操作为一个常量或一个变量赋值,也可以使用多元组一次为多个常量或变量赋值。

        Swift 的赋值操作与其它语言最大的不同是赋值操作除了能够为变量或常量赋值外本身不能够返回值。

        这个特征可以避免某些条件下赋值操作错误地用于相等比较操作。

        如在C语言中,if (x = =y) 很容易误写作if (x = y) ,虽然逻辑结果不正确,但C语言的编译器却无法检查出这种情况,而Swift 语言却可以有效避免这种情况发生,因为

        在Swift 中if (x = y)是无效错误的语句,Swift 规定赋值操作不能返回值,因此Swift 编译器能够检查出这种错误,这也说明使用Swift语言编程能够更加有效和安全。

 2、 算术操作

        Swift 语言对所有的数值类型支持标准的加减乘除(+-*/)四种基本算术操作。而Swift 语言相对C 和 Objective-C改善的地方是算术操作默认不允许溢出。当然你可以选择使用和支持溢出操作。

3 、取余操作(%)

       Swift 的取余操作除了支持针对整数类型的取余操作外,还支持对浮点数的取余操作。

        如8 % 2.5   // equals 0.5

4、 比较操作

       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 }


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


posted on 2014-06-13 14:07  张大大123  阅读(141)  评论(0编辑  收藏  举报

导航