一 基本操做运算编程
一、 赋值操做安全
在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.maxpotentialOverflow += 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,infix或postfix操做类型。以下定义了一个新的称做“+++”的前缀操做:
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 }
版权全部,请转载时注明连接和出处!