在Swift中,一共有四种表达法:前缀表达,二分表达,简单表达,和后缀表达。Evaluating an expression returns a value, causes a side effect, or both.
前缀表达和二分表达可用来在简短语句中使用运算符。简单表达从概念上讲是获取值的最简单方式。后缀表达和前缀表达和二分表达相似,都可以让你建立更为复杂的表达方式;例如函数调用和成员获取等。我们将在本章节中详细解释每种表达方式。
GRAMMAR OF AN EXPRESSION
expression → prefix-expressionbinary-expressionsopt
expression-list → expression expression,expression-list
<ol>
<li> class SomeSuperType {}</li>
<li> class SomeType: SomeSuperType {}</li>
<li> class SomeChildType: SomeType {}</li>
<li> let s = SomeType()</li></ol>
<ol>
<li> let x = s as SomeSuperType </li>
<li> // 成功,则返回值 SomeSuperType</li>
<li> let y = s as Int </li>
<li> // 失败,编译期错误</li>
<li> let z = s as SomeChildType </li>
<li> // 可能在运行期失败,返回值类型为SomeChildType?
对编译器来说,使用 as来确定类型 和 类型声明 具有相同的作用。下面的例子可以说明:
<ol>
<li> let y1 = x as SomeType // 使用as表明类型</li>
<li> let y2: SomeType = x // 使用类型声明
文字表达形式的使用
文字表达由普通的文字(例如字符串或数字),数组或字典名,或者下面的特别文字:
Literal | Type | Value
:------------------------: | :-----------: | :--------------------------------------------------------------------: FILE | String | The name of the file in which it appears LINE | Int | The line number on which it appears. COLUMN | Int | The column number in which it begins. FUNCTION | String | The name of the declaration in which it appears.
在一个函数内部,FUNCTION就是这个函数的名字;在方法内部,它就是方法名;在属性的get方法和set方法中它就是这个属性的名字;在特殊成员例如init和subscript中,它是关键字的名字;在文件的顶层,它是当前模型名。
数组的文字声明是一个包含有序值的集合。其结构如下:
[value1, value2, ... ]
数组内最后一个表达式可以跟句号。一个空数组声明可以用一个空的中括号代表([])。数组值的类型为T[],T代表数组内部表达式的类型。如果其中的元素类型不统一,T代表他们最小超类。
字典的文字声明是一个有键值对的无序集合。它有如下表达:
[key:value1, key:value2, ... ]
字典内最后一个表达式可以跟句号。一个空字典的声明是中括号内加一个冒号([:])以此和空数组的表达形式区分。
字典的类型为Dictionary&lt;keytype, ValueType&gt;,keytype是键的类型,ValueType是其对应值的类型。如果字典有多种类型,keytype和ValueType使他们代表值类型的最小超类。
函数调用的方法
函数的调用方法为:函数名家括号,括号内为参数列表,多个参数用逗号隔开。例如:
function name(argument value 1, argument value 2)
函数名可以以任意具有函数类型的名字来命名。
如果函数声明中定义了参数名,那么函数调用时,参数名必须在参数值前面,并用冒号分开,示例如下:
function name(argument name 1: argument value 1, argument name 2: argument value 2)
函数的调用时可以在闭合括号的后面紧跟一个闭包后缀。这个后缀代码块也是这个函数的后加的参数。下面的两个函数调用等效:
// someFunction 的参数列表由一个参数x和一个闭包组成 someFunction(x, {$0 == 13}) someFunction(x) {$0 == 13}
如果闭包是唯一参数,小括号可以省略。
// someFunction 只有一个参数 myData.someMethod() {$0 == 13} myData.someMethod {$0 == 13}
GRAMMAR OF A FUNCTION CALL EXPRESSION
function-call-expression → postfix-expressionparenthesized-expression function-call-expression → postfix-expressionparenthesized-expressionopttrailing-closure trailing-closure → closure-expression
<ol>
<li> var x = SomeClass.someClassFunction // 正确 var y = SomeClass.init // 错误
你也可以使用初始化器来调用超类的初始化器。
<ol>
<li> class SomeSubClass: SomeSuperClass { init() { // subclass initialization goes here super.init() } }</li></ol>
<ol>
<li> GRAMMAR OF AN INITIALIZER EXPRESSION</li></ol>
<ol>
<li> initializer-expression → postfix-expression.init
显式成员表达式的使用
显式成员表达式可以访问有名的类,元组,或组件的成员。在表达式和成员名之间用点隔开。
expression.member name
有名成员变量可作为类的声明的一部分或其拓展。例如:
<ol>
<li> class SomeClass {</li>
<li> var someProperty = 42</li>
<li> }</li>
<li> let c = SomeClass()</li>
<li> let y = c.someProperty</li>
<li> // Member access
元组的命名是用数字由零开始按顺序隐式命名的。例如:
var t = (10, 20, 30) t.0 = t.1 // 现在 t 是 (20, 20, 30)
组件成员可以获取其最顶层声明。
GRAMMAR OF AN EXPLICIT MEMBER EXPRESSION
explicit-member-expression → postfix-expression.decimal-digit explicit-member-expression → postfix-expression.identifiergeneric-argument-clauseopt