Swift语言—— 表达式

上传人:jin****ng 文档编号:220004566 上传时间:2023-06-28 格式:DOCX 页数:21 大小:28.77KB
收藏 版权申诉 举报 下载
Swift语言—— 表达式_第1页
第1页 / 共21页
Swift语言—— 表达式_第2页
第2页 / 共21页
Swift语言—— 表达式_第3页
第3页 / 共21页
资源描述:

《Swift语言—— 表达式》由会员分享,可在线阅读,更多相关《Swift语言—— 表达式(21页珍藏版)》请在装配图网上搜索。

1、Swift言:表达式Swift中存在四种表达式:前缀(prefix)表达式,二元(binary)表 达式,主要(primary)表达式和后缀(postfix)表达式。表达式可以返 回一个值,以及运行某些逻辑(causes a side effect )。前缀表达式和二元表达式就是对某些表达式使用各种运算符(operators )0主要表达式是最短小的表达式,它提供了获取(变量 的)值的一种途径。后缀表达式则允许你建立复杂的表达式,例如配 合函数调用和成员访问。每种表达式都在下面有详细论述表达式的语法expression prefix-expressionbinary-expressions(o

2、pt)expression-list expression expression,expression-list前缀表达式(Prefix Expressions前缀表达式由前缀符号和表达式组成。(这个前缀符号只能接收一个 参数)Swift标准库支持如下的前缀操作符:+ 自增 1(increment)一 自减 1(decrement)!逻辑否(Logical NOT ) 按位否(Bitwise NOT )+ 力 口(Unary plus)-减(Unary minus)对于这些操作符的使用,请参见:Basic Operators and AdvancedOperators作为对上面标准库运算符的补

3、充,你也可以对某个函数的参数使用&运算符。更多信息,请参见:In-Out parameters”.前缀表达式的语法prefix-expression prefix-operator (opt) postfix-expression prefix-expression in-out-expression in-out-expression &- identifier二元表达式(Binary Expressions)二元表达式由左边参数” + 二元运算符” + 右边参数”组成,它有如下的形式:left-hand argument operator right-hand argumentSwift标

4、准库提供了如下的二元运算符:求幕相关(无结合,优先级160) 按位左移(Bitwise left shift)按位右移(Bitwise right shift)乘除法相关(左结合,优先级150)*乘%求余&* 乘法,忽略溢出(Multiply, ignoring overflow)&/ 除法,忽略溢出(Divide, ignoring overflow)&% 求余,忽略溢出(Remainder, ignoring overflow)& 位与(Bitwise AND)加减法相关(左结合,优先级140)+加-减&+ Add with overflow&- Subtract with overflo

5、w| 按位或(Bitwise OR )A 按位异或(Bitwise XOR)Range (无结合,优先级135).半闭值域 Half-closed range 全闭值域 Closed range类型转换(无结合,优先级132)is 类型检查(type check)as类型转换(type cast)Comparative (无结合,优先级130)小于=小于等于大于=大于等于=等于!=不等=恒等于!=不恒等=模式匹配(Pattern match)合取(Conjunctive)(左结合,优先级120)& 逻辑与(Logical AND)析取(Disjunctive)(左结合,优先级110)| 逻辑或

6、(Logical OR)三元条件(Ternary Conditional )(右结合,优先级100)?:三元条件 Ternary conditional赋值(Assignment)(右结合,优先级90)=赋值(Assign)*= Multiply and assign/= Divide and assign%= Remainder and assign+= Add and assign-=Subtract and assign =三元条件运算符(Ternary Conditional Operator)三元条件运算符是根据条件来获取值。形式如下:condition expression use

7、d if true B expression used if false如果condition是true,那么返回第一个表达式的值(此时不会调用第二个表达式),否则返回第二个表达式的值(此时不会调用第一个 表达式)。想看三元条件运算符的例子,请参见:Ternary Conditional Operator.三元条件表达式conditional-operator ?expression:类型转换运算符(Type-Casting Operators)有两种类型转换操作符:as和is.它们有如下的形式:as十expression typeas?,expressiontypeis十expression

8、 typeas运算符会把目标表达式转换成指定的类型(specified type),过程如下: 如果类型转换成功,那么目标表达式就会返回指定类型的实例(instance).例如:把子类(subclass)变成父类(superclass)时. 如果转换失败,则会抛出编译错误(compile-time error)。如果上述两个情况都不是(也就是说,编译器在编译时期无法确定转换 能否成功,)那么目标表达式就会变成指定的类型的optional. (is an optional of the specified type )然后在运行时,如果转换成功,目标 表达式就会作为optional的一部分来返回

9、,否则,目标表达式返回nil. 对应的例子是: 把一个superclass转换成一个subclass.class SomeSuperType class SomeType: SomeSuperType class SomeChildType: SomeType let s = SomeType()let x = s as SomeSuperType / known to succeed; type isSomeSuperTypelet y = s as Int/ known to fail; compile-time errorlet z = s as SomeChildType / migh

10、t fail at runtime; type is SomeChildType?使用as做类型转换跟正常的类型声明,对于编译器来说是一样的。例 如:let y1 = x as SomeType / Type information from aslet y2: SomeType = x / Type information from an annotationis运算符在“运行时(runtime) ”会做检查。成功会返回true,否则 falseThe check must not be known to be true or false at compile time. The follo

11、wing are invalid:上述检查在编译时(compile time) ”不能使用。 例如下面的使用是错误的:“hello” is String“hello” is Int关于类型转换的更多内容和例子,请参见:Type Casting.类型转换的语法 type-casting-operator istype| as?(opt)type主要表达式(Primary Expressions)主要表达式是最基本的表达式。它们可以跟 前缀表达式,二元表达式, 后缀表达式以及其他主要表达式组合使用。主要表达式的语法primary-expression identifiergeneric-argum

12、ent-clause(opt) primary-expression literal-expression primary-expression self-expression primary-expression superclass-expression primary-expression closure-expression primary-expression parenthesized-expression primary-expression implicit-member-expression primary-expression wildcard-expression字符型表

13、达式(Literal Expression)由这些内容组成:普通的字符(string, number), 一个字符的字典或者数组,或者下面列表中的特殊字符。字符(Literal) 类型(Type)值(Value)FILE String 所在的文件名LINE Int 所在的行数COLUMN Int 所在的列数FUNCTION String 所在的 function 的名字在某个函数(function)中,FUNCTION会返回当前函数的名字。在 某个方法(method)中,它会返回当前方法的名字。在某个property 的getter/setter中会返回这个属性的名字。在init/subscr

14、ipt中 只有的 特殊成员(member)中会返回这个keyword的名字,在某个文件的顶 端(the top level of a file),它返回的是当前module的名字。一个array literal,是一个有序的值的集合。它的形式是:value 15 value 25 .数组中的最后一个表达式可以紧跟一个逗号(,)表示空数组。array literal的type是T,这个T就是数组中元素的type.如果该数组中有 多种type, T则是跟这些type的公共supertype最接近的type.(closest common supertype)一个dictionary literal

15、是一个包含无序的键值对(key-value pairs)的 集合,它的形式是:key 1: value 1, key 2: value 2,.dictionary的最后一个表达式可以是一个逗号(,).:表示一个空的 dictionary.它的 type 是 Dictionary (这里 KeyType 表示 key 的 type, ValueType表示 value 的type)女口果这个dictionary 中包含多种 types, 那么KeyType, Value则对应着它们的公共supertype最接近的type(closest common supertype).字符型表达式的语法li

16、teral-expression literal literal-expression array-literal| dictionary-literal literal-expression FILE LINE、COLUMN- FUNCTION array-literal array-literal-itemsopt array-literal-items array-literal-item,(opt) | array-literal-item,array-literal-items array-literal-item expression dictionary-literal dict

17、ionary-literal-items : dictionary-literal-items dictionary-literal-item,(opt)| dictionary-literal-item,-dictionary-literal-items dictionary-literal-item expressioexpressionself 表达式(Self Expression)self表达式是对 当前type或者当前instance的引用。它的形式如下:self self.member name selfsubscript index self initializer argum

18、ents) self.init (initializer arguments)女口果在 initializer, subscript, instance method 中,self 等同于当前 type 的 instance.在一个静态方法(static method),类方法(class method) 中,self等同于当前的type.当访问member (成员变量时),self用来区分重名变量(例如函数 的参数).例如,(下面的 self.greeting 指的是 var greeting: String, 而不是 init(greeting: String)class SomeClas

19、s var greeting: Stringinit(greeting: String) self.greeting = greeting在mutating方法中,你可以使用self对 该instance进行赋值。struct Point var x = 0.0, y = 0.0mutating func moveByX(deltaX: Double, y deltaY: Double) self = Point(x: x + deltaX, y: y + deltaY)self表达式的语法 self-expression self self-expression self.identifie

20、r self-expression selfexpression self-expression self.init 超类表达式(Superclass Expression)超类表达式可以使我们在某个class中访问它的超类.它有如下形式:SUPer.member namesuperLubscript indexsuper.init (initializer arguments)形式1用来访问超类的某个成员(member).形式2用来访问该超类 的subscript实现。形式3用来访问该超类的initializer.子类(subclass)可以通过超类(superclass)表达式在它们的me

21、mber, subscripting和initializers中来利用它们超类中的某些实现(既有的方 法或者逻辑)。GRAMMAR OF A SUPERCLASS EXPRESSIONsuperclass-expression superclass-method-expression | superclass-subscript-expression| superclass-initializer-expression superclass-method-expression super.identifier superclass-subscript-expression superexpre

22、ssion superclass-initializer-expression super.init闭包表达式(Closure Expression)闭包(closure)表达式可以建立一个闭包(在其他语言中也叫lambda,或者 匿名函数(anonymous function).跟函数(function)的声明 一样,闭包(closure)包含了可执行的代码(跟方法主体(statement)类似)以及接收(capture)的参数。它的形式如下: (parameters) - return type instatements闭包的参数声明形式跟方法中的声明一样,请参见:FunctionDecl

23、aration.闭包还有几种特殊的形式,让使用更加简洁:闭包可以省略 它的参数的type和返回值的type.如果省略了参数和 参数类型,就也要省略in关键字。如果被省略的type无法被编译器 获知(inferred),那么就会抛出编译错误。闭包可以省略参数,转而在方法体(statement)中使用0,1, $2来引 用出现的第一个,第二个,第三个参数。如果闭包中只包含了一个表达式,那么该表达式就会自动成为该闭包的 返回值。在执行type inference时,该表达式也会返回。下面几个闭包表达式是等价的:myFunction (x: Int, y: Int) - Int inreturn x

24、+ y myFunction (x, y) inreturn x + ymyFunction return $0 + $1 myFunction $0 + $1 关于 向闭包中传递参数的内容,参见:Function Call Expression.闭包表达式可以通过一个参数列表(capture list)来显式指定它需要 的参数。参数列表由中括号括起来,里面的参数由逗号,分隔。 一旦使用了参数列表,就必须使用in关键字(在任何情况下都得这样做, 包括忽略参数的名字,type,返回值时等等)。在闭包的参数列表(capture list)中,参数可以声明为weak或者 unowned .myFun

25、ction print(self.title) / strong capturemyFunction weak self in print (selfLtitle) / weak capturemyFunction unowned self in print(self.title) / unowned capture 在参数列表中,也可以使用任意表达式来赋值.该表达式会在闭包被 执行时赋值,然后按照不同的力度来获取(这句话请慎重理解)。(captured with the specified strength.) 例如:/ Weak capture of “self.parent” as “p

26、arent”myFunction weak parent = self.parent in print (parentLtitle) 关于闭包表达式的更多信息和例子,请参见:Closure Expressions.闭包表达式的语法 closure-expression closure-signatureoptstatements closure-signature parameter-clausefunction-result(opt)in closure-signature identifier-listfunction-result(opt)in closure-signature cap

27、ture-listparameter-clausefunction-result(opt)- in closure-signature capture-listidentifier-listfunction-result(opt)in closure-signature capture-listin capture-list capture-specifier- expression capture-specifier weak| unowned| unowned (safe) | unowned (unsafe)隐式成员表达式(I mplicit Member Expressioh在可以判断

28、出类型(type)的上下文(context)中,隐式成员表达式是 访问某个 type 的 member( 例女口 class method, enumeration case) 的简洁方法。它的形式是:.member name例子:var x = MyEnumeration.SomeValuex = .AnotherValue隐式成员表达式的语法implicit-member-expression .identifier 圆括号表达式(Parenthesized Expression)圆括号表达式由多个子表达式和逗号,组成。每个子表达式前面可以有identifier x:这样的可选前缀。形式如

29、下:(identifier 1: expression 1, identifier 2: expression 2,) 圆括号表达式用来建立tuples ,然后把它做为参数传递给function. 如果某个圆括号表达式中只有一个 子表达式,那么它的type就是 子 表达式的type。例如:(1)的type是Int,而不是(Int)圆括号表达式的语法parenthesized-expression (expression-element-list (opt) expression-element-list expression-element| expression-element,-expre

30、ssion-element-list expression-element expression identifier:- expression通配符表达式(Wildcard Expression)通配符表达式用来忽略传递进来的某个参数。例如:下面的代码中,10 被传递给x, 20被忽略(译注:好奇葩的语法。)(X=(10, 20)/ x is 10, 20 is ignored通配符表达式的语法wildcard-expression _后缀表达式(Postfix Expressions)后缀表达式就是在某个表达式的后面加上操作符。严格的讲,每个主要表达式(primary expression

31、)都是一个后缀表达式Swift标准库提供了下列后缀表达式:+ Increment一 Decrement对于这些操作符的使用,请参见:Basic Operators and Advanced Operators后缀表达式的语法postfix-expression primary-expression postfix-expression postfix-expressionpostfix-operator postfix-expression function-call-expression postfix-expression initializer-expression postfix-ex

32、pression explicit-member-expression postfix-expression postfix-self-expression postfix-expression dynamic-type-expression postfix-expression subscript-expression postfix-expression forced-value-expression postfix-expression optional-chaining-expression函数调用表达式(F unction Call Expression函数调用表达式由函数名和参数列

33、表组成。它的形式如下:function name(argument value 1, argument value 2)The function name can be any expression whose value is of a function type.(不用翻译了,太罗嗦)如果该function的声明中指定了参数的名字,那么在调用的时候也必须得写出来.例如:function name(argument name 1: argument value 1, argument name2: argument value 2)可以在 函数调用表达式的尾部(最后一个参数之后)加上一个闭包

34、(closure),该闭包会被目标函数理解并执行。它具有如下两种写法:/ someFunction takes an integer and a closure as its arguments someFunction(x, $0 = 13)someFunction (x) $0 = 13如果闭包是该函数的唯一参数,那么圆括号可以省略。/ someFunction takes a closure as its only argument myData.someMethod() $0 = 13myData.someMethod $0 = 13GRAMMAR OF A FUNCTION CALL

35、 EXPRESSIONfunction-call-expression postfix-expression- parenthesized-expression function-call-expression postfix-expressionparenthesized-expression(opt)trailing-closure trailing-closure closure-expression初始化函数表达式(Initializer ExpressionInitializer表达式用来给某个Type初始化。它的形式如下:expression.init (initializer a

36、rguments)(Initializer表达式用来给某个Type初始化。)跟函数(function) 不 同,initializer不能返回值。var x = SomeClass.someClassFunction / okvar y = SomeClass.init/ errorswift可以通过initializer表达式来委托调用(delegate to )到superclass 的 initializers.swiftclass SomeSubClass: SomeSuperClass init () / subclass initialization goes heresuper.

37、init ()initializer表达式的语法initializer-expression postfix-expression.init显式成员表达式(Explicit Member Expression显示成员表达式允许我们访问type, tuple, module的成员变量。它的形式如下:expression.member name该 member就是某个type在声明时候所定义(declaration or extension)的变量,例如:class SomeClass var someProperty = 42let c = SomeClass()let y = c.somePr

38、operty / Member access对于tuple,要根据它们出现的顺序(0,1,2.)来使用:var t = (10, 20, 30)t.0 = t.1/ Now t is (20, 20, 30)The members of a module access the top-level declarations of thatmodule.(不确定:对于某个module的member的调用,只能调用在 top-level 声明中的 member.)显示成员表达式的语法explicit-member-expression postfix-expression.decimal-digit

39、 explicit-member-expression postfix-expression.identifier- generic-argument-clause(opt)后缀 self 表达式(Postfix Self Expression )后缀表达式由某个表达式+ .self组成.形式如下:expression.self type.self形式1表示会返回expression的值。例如:x.self返回x形式2:返回对应的type。我们可以用它来动态的获取某个instance的 type。后缀self表达式的语法postfix-self-expression postfix-expre

40、ssion.selfdynamic 表达式(Dynamic Type Expression)(因为dynamicType是一个独有的方法,所以这里保留了英文单词,未作翻译,一类似与self expression)dynamicType 表达式由 某个表达式 + .dynamicType组成。expression.dynamicType上面的形式中,expression不能是某type的名字(当然了,如果我都知道它的名字了还需要动态来获取它吗)。动态类型表达式会返回运行时”某个instance的type,具体请看下面的列子:class SomeBaseClass class func print

41、ClassName () println (SomeBaseClass )class SomeSubClass: SomeBaseClass override class func printClassName () println (SomeSubClass )let someInstance: SomeBaseClass = SomeSubClass ()/ someInstance is of type SomeBaseClass at compile time, but/ someInstance is of type SomeSubClass at runtimesomelnstan

42、ce.dynamicType.printClassName ()/ prints SomeSubClassdynamic type 表达式dynamic-type-expression postfix-expression.dynamicType附属脚本表达式(Subscript Expression附属脚本表达式提供了通过附属脚本访问getter/setter的方法。它的形式是:expressionindex expressions可以通过附属脚本表达式通过getter获取某个值,或者通过setter赋予某个值.关于 subscript 的声明,请参见:Protocol Subscript

43、Declaration.附属脚本表达式的语法subscript-expression postfix-expressionexpression-list强制取值表达式(Forced-Value Expression )强制取值表达式用来获取某个目标表达式的值(该目标表达式的值必须 不是nil )。它的形式如下:expression!如果该表达式的值不是nil,则返回对应的值。否则,抛出运行时错误(runtime error)。强制取值表达式的语法forced-value-expression postfix-expression!可选链表达式(Optional-Chaining Express

44、ion )可选链表达式由目标表达式+?组成,形式如下:expression?后缀?返回目标表达式的值,把它做为可选的参数传递给后续的表达 式如果某个后缀表达式包含了可选链表达式,那么它的执行过程就比较特 殊:首先先判断该可选链表达式的值,如果是nil,整个后缀表达式都 返回nil,如果该可选链的值不是nil,则正常返回该后缀表达式的值(依 次执行它的各个子表达式)。在这两种情况下,该后缀表达式仍然是- 个optional type (In either case, the value of the postfix expression is still of an optional type)

45、 如果某个后缀表达式的子表达式中包含了可选链表达式,那么只有 最外层的表达式返回的才是一个optional type.例如,在下面的例子中, 如果c不是nil,那么c?.property.performAction()这句代码在执行 时,就会先获得c的property方法,然后调用performAction ()方法。然后对于c?.property.performAction () 这个整体,它的返回值是一 个 optional type.var c: SomeClass?var result: Bool? = c?.property.performAction()如果不使用可选链表达式,那么上面例子的代码跟下面例子等价:if let unwrappedC = c result = unwrappedC.property.performAction()可选链表达式的语法optional-chaining-expression postfix-expression?

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!