苹果新的编程语言 Swift 语言进阶(三)--基本运算和扩展运算
一 基本操作运算
1、 赋值操作
在Swift 中,能够使用赋值操作为一个常量或一个变量赋值,也能够使用多元组一次为多个常量或变量赋值。
Swift 的赋值操作与其他语言最大的不同是赋值操作除了可以为变量或常量赋值外本身不可以返回值。
这个特征能够避免某些条件下赋值操作错误地用于相等比較操作。
如在C语言中,if (x = =y) 非常easy误写作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.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 、操作函数
类和结构类型可以定义自己的操作函数,来实现或覆盖某些已经存在操作运算符操作。
例如以下所看到的。在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,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 }
版权全部,请转载时注明链接和出处!