一 基本操作运算

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.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 上运行溢出减一后结果变回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
}

版权全部,请转载时注明链接和出处!


苹果新的编程语言 Swift 语言进阶(三)--基本运算和扩展运算的更多相关文章

  1. 苹果新的编程语言 Swift 语言进阶(七)--枚举、结构、类

    Swift语言中,具有类特征的类型包括三种,即枚举类型.结构类型(包括基本类型,基本类型实际都是结构类型的特例).类.其中枚举类型.结构类型是属于值类型,类属于引用类型.三种类型都可以添加属性.方法. ...

  2. 苹果新的编程语言 Swift 语言进阶(四)--字符串和收集类型

    一.字符串( String  )和字符类型(Character) 字符串是一种字符的带次序的收集类型(相当于数组),字符是字符串中的元素. 在Swift 语言中,字符串是编码独立的Unicode字符的 ...

  3. 苹果新的编程语言 Swift 语言进阶(二)--基本数据类型

    一  .   常量和变量 Swift语言 对常量和变量的声明进行了明确的区分 Swift语言的常量类型比C 语言的constants类型更加强大,语义更加明确. 常量和变量的区别是常量在设置或初始化后 ...

  4. 苹果新的编程语言 Swift 语言进阶(一)--综述

    Swift 是苹果开发和提供的供开发IOS 和OS X应用的一门新的语言.Swift语言基于C 和Objective-C语言,除了提供C 和Objective-C语言具有的所有语法功能外,为了编程方便 ...

  5. 苹果新的编程语言 Swift 语言进阶(十五)--协议

    协议定义了适合某个特定任务或功能需要的方法.属性和其它需求的一个蓝图.协议本身不提供这些需求的实现,它只是描述了一个任务或功能实现的蓝图. 协议与java 语言中的接口定义类似,都是描述了一个实现可以 ...

  6. 苹果新的编程语言 Swift 语言进阶(十四)--扩展

    扩展是为一个已经存在的类.结构.枚举类型添加新功能的一种方式,包括为不能存取源代码的那些已经存在的类型添加功能. 扩展类似于Objective-C语言中的类别,与类别不同的是Swift语言的扩展没有名 ...

  7. 苹果新的编程语言 Swift 语言进阶(五)--控制流

    Swift 语言支持C语言全部的控制语句.包含for  和while循环语句,if和switch条件语句,以及break和continue控制语句等. Swift 语言除了支持以上语句,还添加了一个f ...

  8. 苹果新的编程语言 Swift 语言进阶(十六)--泛型

    泛型允许你定义一个宽松.可重用的函数或者类型,使用泛型能够避免代码的重复,也能以更清楚和抽象的方式来表达程序的意图. 泛型是Swift语言提供的强大功能之一,Swift提供的许多标准库都使用了泛型来创 ...

  9. 苹果新的编程语言 Swift 语言进阶(十一)--实例的初始化与类的析构

    一 .实例的初始化          实例的初始化是准备一个类.结构或枚举的实例以便使用的过程.初始化包括设置一个实例的每一个存储属性为一个初始值,以及执行任何其它新的实例能够使用之前需要的设置或初始 ...

随机推荐

  1. ssm框架下web项目,web.xml配置文件的作用

    1. web.xml中配置了CharacterEncodingFilter,配置这个是拦截所有的资源并设置好编号格式. encoding设置成utf-8就相当于request.setCharacter ...

  2. 由浅入深学习springboot中使用redis

    很多时候,我们会在springboot中配置redis,但是就那么几个配置就配好了,没办法知道为什么,这里就详细的讲解一下 这里假设已经成功创建了一个springboot项目. redis连接工厂类 ...

  3. 诸葛马前课andoid app 应用

    前段时间学了点安卓开发的知识,也在同时,陪家人看了<新闺蜜时代 >的后面几集,其中,周小北提到了诸葛马前课. 于是网上查了些资料,学习了一下马前课的计算方法,本着程序服务生活的原则,省去不 ...

  4. 基于.NET CORE微服务框架 -surging 基于messagepack、protobuffer、json.net 性能对比

    1.前言 surging内部使用的是高性能RPC远程服务调用,如果用json.net序列化肯定性能上达不到最优,所以后面扩展了protobuf,messagepack序列化组件,以支持RPC二进制传输 ...

  5. innobackupex: fatal error: no ‘innodb_buffer_pool_filename’解决方法

    http://www.ttlsa.com/mysql/innobackupex-1-5-1-fatal-error-no-innodb_buffer_pool_filename/

  6. LKD: Chapter 5 System Call

    在Linux中,处理器所作的事可以归纳为3种情况: 1.In user-space, executing user code in a process; 2.In kernel-space, in p ...

  7. [线段树]P1047 校门外的树

    题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L,都种 ...

  8. 项目实战9—企业级分布式存储应用与实战MogileFS、FastDFS

    企业级分布式存储应用与实战-mogilefs 环境:公司已经有了大量沉淀用户,为了让这些沉淀用户长期使用公司平台,公司决定增加用户粘性,逐步发展基于社交属性的多样化业务模式,决定开展用户讨论区.卖家秀 ...

  9. Python中的单例模式

    在 Python 中,我们可以用多种方法来实现单例模式: 使用模块 使用 __new__ 使用装饰器(decorator) 使用元类(metaclass) # mysingleton.py class ...

  10. win7及以上系统打开chm空白或显示"无法打开"的2个解决方案

    1:在文件上右键单击属性.选择解锁. 2:确保文件路径中没有特殊字符.比如"#".如果路径中存在特殊字符,chm文件可能找不到路径而无法显示.如 d:\资料\c#\***.chm. ...