> 1.0 翻譯:[sg552](https://github.com/sg552)?校對:[numbbbbb](https://github.com/numbbbbb),?[stanzhai](https://github.com/stanzhai)
>
> 2.0 翻譯+校對:[EudeMorgen](https://github.com/EudeMorgen)
本頁包含內容:
[TOC=2]
Swift 中存在四種表達式: 前綴(prefix)表達式,二元(binary)表達式,主要(primary)表達式和后綴(postfix)表達式。表達式可以返回一個值,以及運行某些邏輯(causes a side effect)。
前綴表達式和二元表達式就是對某些表達式使用各種運算符(operators)。 主要表達式是最短小的表達式,它提供了獲取(變量的)值的一種途徑。 后綴表達式則允許你建立復雜的表達式,例如配合函數調用和成員訪問。 每種表達式都在下面有詳細論述。
> 表達式語法
> _表達式_?→?[ _試算子(try operator)_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#*)?_可選_?|?[ _前置表達式_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#prefix_expression)?|?[ _二元表達式列表_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#binary_expressions)?_可選_
> _表達式列表_?→?[ _表達式_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#expression)?|?[ _表達式_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#expression)?,?[ _表達式列表_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#expression_list)
## 前綴表達式(Prefix Expressions)
前綴表達式由可選的前綴符號和表達式組成。(這個前綴符號只能接收一個參數)
對于這些操作符的使用,請參見: Basic Operators and Advanced Operators
作為對上面標準庫運算符的補充,你也可以對 某個函數的參數使用 '&'運算符。 更多信息,請參見: "In-Out parameters".
> 前置表達式語法
> _前置表達式_?→?[ _前置運算符_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/LexicalStructure.html#prefix_operator)?_可選_?[ _后置表達式_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#postfix_expression)
> _前置表達式_?→?[ _寫入寫出(in-out)表達式_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#in_out_expression)
> _寫入寫出(in-out)表達式_?→?&?[ _標識符_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/LexicalStructure.html#identifier)
## try 操作符(try operator)
try表達式由緊跟在可能會出錯的表達式后面的`try`操作符組成,形式如下:?`try expression`?強制的try表示由緊跟在可能會出錯的表達式后面的`try!`操作符組成,出錯時會產生一個運行時錯誤,形式如下:?`try! expression`?關于`try`更多的例子和信息請參見:Catching and Handling Errors.
> try表達式語法
> _try 操作符_?→?[ _try_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/LexicalStructure.html#try_operator)?|? _try!_
## 二元表達式(Binary Expressions)
二元表達式由 "左邊參數" + "二元運算符" + "右邊參數" 組成, 它有如下的形式:
> `left-hand argument`?`operator`?`right-hand argument`
關于這些運算符(operators)的更多信息,請參見:Basic Operators and Advanced Operators.
> 注意
> 在解析時, 一個二元表達式表示為一個一級數組(a flat list), 這個數組(List)根據運算符的先后順序,被轉換成了一個tree. 例如: 2 + 3?_5 首先被認為是: 2, + ,?`3`,?_, 5\. 隨后它被轉換成 tree (2 + (3 * 5))
>
> 二元表達式語法
> _二元表達式_?→?[ _二元運算符_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/LexicalStructure.html#binary_operator)?[ _前置表達式_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#prefix_expression)
> _二元表達式_?→?[ _賦值運算符_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#assignment_operator)?[ _前置表達式_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#prefix_expression)
> _二元表達式_?→?[ _條件運算符_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#conditional_operator)?[_前置表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#prefix_expression)
> _二元表達式_?→?[ _類型轉換運算符_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#type_casting_operator)
> _二元表達式列表_?→?[ _二元表達式_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#binary_expression)?[ _二元表達式列表_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#binary_expressions)?_可選_
> _賦值操作符_
## 賦值表達式(Assignment Operator)
賦值表達式會對某個給定的表達式賦值。 它有如下的形式;
> `expression`?=?`value`
就是把右邊的?_value_?賦值給左邊的?_expression_. 如果左邊的_expression_?需要接收多個參數(是一個tuple ),那么右邊必須也是一個具有同樣數量參數的tuple. (允許嵌套的tuple)
~~~
(a, _, (b, c)) = ("test", 9.45, (12, 3))
// a is "test", b is 12, c is 3, and 9.45 is ignored
~~~
賦值運算符不返回任何值。
> 賦值運算符語法
> _賦值運算符_?→?=
## 三元條件運算符(Ternary Conditional Operator)
三元條件運算符 是根據條件來獲取值。 形式如下:
> `condition`???`expression used if true`?:?`expression used if false`
如果?`condition`?是true, 那么返回 第一個表達式的值(此時不會調用第二個表達式), 否則返回第二個表達式的值(此時不會調用第一個表達式)。
想看三元條件運算符的例子,請參見: Ternary Conditional Operator.
> 三元條件運算符語法
> _三元條件運算符_?→???[ _表達式_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#expression)?:
## 類型轉換運算符(Type-Casting Operators)
有4種類型轉換運算符:?`is`,`as`,`?`和`!`. 它們有如下的形式:
> `expression`?is?`type`
> `expression`?as?`type`
> `expression`?is??`type`?`expression`?as!?`type`
`is`運算符在程序運行時檢查表達式能否向下轉化為指定的類型,如果可以在返回`ture`,如果不行,則返回`false`。
`as`運算符在程序編譯時執行類型轉化,且總是成功,比如進行向上轉換(upcast)和橋接(bridging)。向上轉換指把表達式轉換成類型的超類的一個是實例而不使用中間的變量。以下表達式是等價的:
~~~
func f(any: Any) { print("Function for Any") }
func f(int: Int) { print("Function for Int") }
let x = 10
f(x)
// prints "Function for Int"
let y: Any = x
f(y)
// prints "Function for Any"
f(x as Any)
// prints "Function for Any"
~~~
橋接運算可以讓你把一個Swift標準庫中的類型的表達式作為一個與之相關的基礎類(比如NSString)來使用,而不需要新建一個實例。關于橋接的更多實例參見Using Swift with Cocoa and Objective-C中的Cocoa Data Types。
`as?`操作符為帶條件的類型轉換。`as?`操作符返回可選的轉換類型。在運行時,如果轉換成功,表達式的值會被覆蓋掉再返回,如果轉換不成功的話,則返回`nil`。如果條件轉換中的條件的真值一開始就已經確定真偽了,則在編譯時會報錯。
`a!`操作符表示強制轉換,其返回指定的類型,而不是可選的類型。如果轉換失敗,則會出現運行時錯誤。表達式`x as T`效果等同于`(x as? T)!`。
關于類型轉換的更多內容和例子,請參見: Type Casting.
> 類型轉換運算符(type-casting-operator)語法
> _類型轉換運算符_?→?is?[ _類型_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/03_Types.html#type)?_類型轉換運算符_?→?as?[ _類型_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/03_Types.html#type)?_類型轉換運算符_?→?is???[ _類型_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/03_Types.html#type)?_類型轉換運算符_?→?as?! [ _類型_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/03_Types.html#type)
## 主表達式(Primary Expressions)
`主表達式`是最基本的表達式。 它們可以跟 前綴表達式,二元表達式,后綴表達式以及其他主要表達式組合使用。
> 主表達式語法
> _主表達式_?→?[_標識符_](http://wiki.jikexueyuan.com/project/swift/chapter3/LexicalStructure.html#identifier)?[_泛型參數子句_](http://wiki.jikexueyuan.com/project/swift/chapter3/GenericParametersAndArguments.html#generic_argument_clause)?_可選_
> _主表達式_?→?[_字符型表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#literal_expression)
> _主表達式_?→?[_self表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#self_expression)
> _主表達式_?→?[_超類表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#superclass_expression)
> _主表達式_?→?[_閉包表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#closure_expression)
> _主表達式_?→?[_圓括號表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#parenthesized_expression)
> _主表達式_?→?[_隱式成員表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#implicit_member_expression)
> _主表達式_?→?[_通配符表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#wildcard_expression)
### 字符型表達式(Literal Expression)
由這些內容組成:普通的字符(string, number) , 一個字符的字典或者數組,或者下面列表中的特殊字符。
| 字符(Literal) | 類型(Type) | 值(Value) |
| --- | --- | --- |
| /FILE | String | 所在的文件名 |
| /LINE | Int | 所在的行數 |
| /COLUMN | Int | 所在的列數 |
| /FUNCTION | String | 所在的function 的名字 |
在某個函數(function)中,`__FUNCTION__`?會返回當前函數的名字。 在某個方法(method)中,它會返回當前方法的名字。 在某個property 的getter/setter中會返回這個屬性的名字。 在特殊的成員如init/subscript中 會返回這個關鍵字的名字,在某個文件的頂端(the top level of a file),它返回的是當前module的名字。
當作為函數或者方法時,字符型表達式的值在被調用時初始化。
~~~
func logFunctionName(string: String = __FUNCTION__) {
print(string)
}
func myFunction() {
logFunctionName() // Prints "myFunction()".
}
myFunction()
namedArgs(1, withJay: 2)
~~~
一個`array literal`,是一個有序的值的集合。 它的形式是:
> [`value 1`,?`value 2`,?`...`]
數組中的最后一個表達式可以緊跟一個逗號(','). []表示空數組 。 array literal的type是 T[], 這個T就是數組中元素的type. 如果該數組中有多種type, T則是跟這些type的公共`supertype`最接近的type.空的`array literal`由一組方括號定義,可用來創建特定類型的空數組。
~~~
var emptyArray: [Double] = []
~~~
一個`dictionary literal`?是一個包含無序的鍵值對(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).一個空的dictionary literal由方括號中加一個冒號組成,以此來與空array literal區分開,可以使用空的dictionary literal來創建特定類型的鍵值對。
~~~
var emptyDictionary: [String: Double]=[:]
~~~
> 字面量表達式語法
> _字面量表達式_?→?[_字面量_](http://wiki.jikexueyuan.com/project/swift/chapter3/LexicalStructure.html#literal)
> _字面量表達式_?→?[_數組字面量_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#array_literal)?|?[_字典字面量_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#dictionary_literal)
> _字面量表達式_?→?__FILE__?|?__LINE__?|?__COLUMN__?|?__FUNCTION__
> _數組字面量_?→?[?[_數組字面量項列表_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#array_literal_items)?_可選_?]
> _數組字面量項列表_?→?[_數組字面量項_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#array_literal_item)?,?_可選_?|?[_數組字面量項_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#array_literal_item)?,?[_數組字面量項列表_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#array_literal_items)
> _數組字面量項_?→?[_表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#expression)
> _字典字面量_?→?[?[_字典字面量項列表_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#dictionary_literal_items)?]?|?[?:?]
> _字典字面量項列表_?→?[_字典字面量項_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#dictionary_literal_item)?,?_可選_?|?[_字典字面量項_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#dictionary_literal_item)?,?[_字典字面量項列表_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#dictionary_literal_items)
> _字典字面量項_?→?[_表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#expression)?:?[_表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#expression)
### self表達式(Self Expression)
self表達式是對 當前type 或者當前instance的引用。它的形式如下:
> self
> self.`member name`
> self[`subscript index`]
> self(`initializer arguments`) 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 SomeClass {
var greeting: String
init(greeting: String) {
self.greeting = greeting
}
}
~~~
在mutating 方法中, 你可以使用self 對 該instance進行賦值。
~~~
struct Point {
var x = 0.0, y = 0.0
mutating func moveByX(deltaX: Double, y deltaY: Double) {
self = Point(x: x + deltaX, y: y + deltaY)
}
}
~~~
> Self 表達式語法
> _self表達式_?→?self
> _self表達式_?→?self?.?[_標識符_](http://wiki.jikexueyuan.com/project/swift/chapter3/LexicalStructure.html#identifier)
> _self表達式_?→?self?[?[_表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#expression)?]
> _self表達式_?→?self?.?init
### 超類表達式(Superclass Expression)
超類表達式可以使我們在某個class中訪問它的超類. 它有如下形式:
> super.`member name`
> super[`subscript index`]
> super.init(`initializer arguments`)
形式1 用來訪問超類的某個成員(member). 形式2 用來訪問該超類的 subscript 實現。 形式3 用來訪問該超類的 initializer.
子類(subclass)可以通過超類(superclass)表達式在它們的 member, subscripting 和 initializers 中來利用它們超類中的某些實現(既有的方法或者邏輯)。
> 超類(superclass)表達式語法
> _超類表達式_?→?[_超類方法表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#superclass_method_expression)?|?[_超類下標表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#超類下標表達式)?|?[_超類構造器表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#superclass_initializer_expression)
> _超類方法表達式_?→?super?.?[_標識符_](http://wiki.jikexueyuan.com/project/swift/chapter3/LexicalStructure.html#identifier)
> _超類下標表達式_?→?super?[?[_表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#expression)?]
> _超類構造器表達式_?→?super?.?init
### 閉包表達式(Closure Expression)
閉包(closure) 表達式可以建立一個閉包(在其他語言中也叫 lambda, 或者 匿名函數(anonymous function)). 跟函數(function)的聲明一樣, 閉包(closure)包含了可執行的代碼(跟方法主體(statement)類似) 以及接收(capture)的參數。 它的形式如下:
~~~
{ (parameters) -> return type in
statements
}
~~~
閉包的參數聲明形式跟方法中的聲明一樣, 請參見:Function Declaration.
閉包還有幾種特殊的形式, 讓使用更加簡潔:
* 閉包可以省略 它的參數的type 和返回值的type. 如果省略了參數和參數類型,就也要省略 'in'關鍵字。 如果被省略的type 無法被編譯器獲知(inferred) ,那么就會拋出編譯錯誤。
* 閉包可以省略參數,轉而在方法體(statement)中使用 $0, $1, $2 來引用出現的第一個,第二個,第三個參數。
* 如果閉包中只包含了一個表達式,那么該表達式就會自動成為該閉包的返回值。 在執行 'type inference '時,該表達式也會返回。
下面幾個 閉包表達式是 等價的:
~~~
myFunction {
(x: Int, y: Int) -> Int in
return x + y
}
myFunction {
(x, y) in
return x + y
}
myFunction { return $0 + $1 }
myFunction { $0 + $1 }
~~~
關于 向閉包中傳遞參數的內容,參見: Function Call Expression.
閉包表達式可以通過一個參數列表(capture list) 來顯式指定它需要的參數。 參數列表 由中括號 [] 括起來,里面的參數由逗號','分隔。一旦使用了參數列表,就必須使用'in'關鍵字(在任何情況下都得這樣做,包括忽略參數的名字,type, 返回值時等等)。
在閉包的參數列表( capture list)中, 參數可以聲明為 'weak' 或者 'unowned' .
~~~
myFunction { print(self.title) } // strong capture
myFunction { [weak self] in print(self!.title) } // weak capture
myFunction { [unowned self] in print(self.title) } // unowned capture
~~~
在參數列表中,也可以使用任意表達式來賦值. 該表達式會在 閉包被執行時賦值,然后按照不同的力度來獲取(這句話請慎重理解)。(captured with the specified strength. ) 例如:
~~~
// Weak capture of "self.parent" as "parent"
myFunction { [weak parent = self.parent] in print(parent!.title) }
~~~
關于閉包表達式的更多信息和例子,請參見: Closure Expressions.
> 閉包表達式語法
> _閉包表達式_?→?{?[_閉包簽名(Signational)_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#closure_signature)?_可選_?[_多條語句(Statements)_](http://wiki.jikexueyuan.com/project/swift/chapter3/10_Statements.html#statements)?}
> _閉包簽名(Signational)_?→?[_參數子句_](http://wiki.jikexueyuan.com/project/swift/chapter3/05_Declarations.html#parameter_clause)?[_函數結果_](http://wiki.jikexueyuan.com/project/swift/chapter3/05_Declarations.html#function_result)?_可選_?in
> _閉包簽名(Signational)_?→?[_標識符列表_](http://wiki.jikexueyuan.com/project/swift/chapter3/LexicalStructure.html#identifier_list)?[_函數結果_](http://wiki.jikexueyuan.com/project/swift/chapter3/05_Declarations.html#function_result)?_可選_?in
> _閉包簽名(Signational)_?→?[_捕獲(Capature)列表_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#capture_list)?[_參數子句_](http://wiki.jikexueyuan.com/project/swift/chapter3/05_Declarations.html#parameter_clause)?[_函數結果_](http://wiki.jikexueyuan.com/project/swift/chapter3/05_Declarations.html#function_result)?_可選_?in
> _閉包簽名(Signational)_?→?[_捕獲(Capature)列表_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#capture_list)?[_標識符列表_](http://wiki.jikexueyuan.com/project/swift/chapter3/LexicalStructure.html#identifier_list)?[_函數結果_](http://wiki.jikexueyuan.com/project/swift/chapter3/05_Declarations.html#function_result)?_可選_?in
> _閉包簽名(Signational)_?→?[_捕獲(Capature)列表_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#capture_list)?in
> _捕獲(Capature)列表_?→?[?[_捕獲(Capature)說明符_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#capture_specifier)?[_表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#expression)?]
> _捕獲(Capature)說明符_?→?weak?|?unowned?|?unowned(safe)?|?unowned(unsafe)
### 隱式成員表達式(Implicit Member Expression)
在可以判斷出類型(type)的上下文(context)中,隱式成員表達式是訪問某個type的member( 例如 class method, enumeration case) 的簡潔方法。 它的形式是:
> .`member name`
例子:
~~~
var x = MyEnumeration.SomeValue
x = .AnotherValue
~~~
> 隱式成員表達式語法
> _隱式成員表達式_?→?.?[_標識符_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#identifier)
### 圓括號表達式(Parenthesized Expression)
圓括號表達式由多個子表達式和逗號','組成。 每個子表達式前面可以有 identifier x: 這樣的可選前綴。形式如下:
> (`identifier 1`:?`expression 1`,?`identifier 2`:?`expression 2`,?`...`)
圓括號表達式用來建立tuples , 然后把它做為參數傳遞給 function. 如果某個圓括號表達式中只有一個 子表達式,那么它的type就是 子表達式的type。例如: (1)的 type是Int, 而不是(Int)
> 圓括號表達式(Parenthesized Expression)語法
> _圓括號表達式_?→?(?[_表達式元素列表_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#expression_element_list)?_可選_?)
> _表達式元素列表_?→?[_表達式元素_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#expression_element)?|?[_表達式元素_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#expression_element)?,?[_表達式元素列表_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#expression_element_list)
> _表達式元素_?→?[_表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#expression)?|?[_標識符_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#identifier)?:?[_表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#expression)
### 通配符表達式(Wildcard Expression)
通配符表達式用來忽略傳遞進來的某個參數。例如:下面的代碼中,10被傳遞給x, 20被忽略(譯注:好奇葩的語法。。。)
~~~
(x, _) = (10, 20)
// x is 10, 20 is ignored
~~~
> 通配符表達式語法
> _通配符表達式_?→?_
## 后綴表達式(Postfix Expressions)
后綴表達式就是在某個表達式的后面加上 操作符。 嚴格的講,每個主要表達式(primary expression)都是一個后綴表達式
Swift 標準庫提供了下列后綴表達式:
* ++ Increment
* -- Decrement
對于這些操作符的使用,請參見: Basic Operators and Advanced Operators
> 后置表達式語法
> _后置表達式_?→?[_主表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#primary_expression)
> _后置表達式_?→?[_后置表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#postfix_expression)?[_后置運算符_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#postfix_operator)
> _后置表達式_?→?[_函數調用表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#function_call_expression)
> _后置表達式_?→?[_構造器表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#initializer_expression)
> _后置表達式_?→?[_顯示成員表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#explicit_member_expression)
> _后置表達式_?→?[_后置self表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#postfix_self_expression)
> _后置表達式_?→?[_動態類型表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#dynamic_type_expression)
> _后置表達式_?→?[_下標表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#subscript_expression)
> _后置表達式_?→?[_強制取值(Forced Value)表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#forced_value_expression)
> _后置表達式_?→?[_可選鏈(Optional Chaining)表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#optional_chaining_expression)
### 函數調用表達式(Function Call Expression)
函數調用表達式由函數名和參數列表組成。它的形式如下:
> `function name`(`argument value 1`,?`argument value 2`)
如果該function 的聲明中指定了參數的名字,那么在調用的時候也必須得寫出來. 例如:
> `function name`(`argument name 1`:?`argument value 1`,?`argument name 2`:?`argument value 2`)
可以在 函數調用表達式的尾部(最后一個參數之后)加上 一個閉包(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 == 13}
myData.someMethod {$0 == 13}
~~~
> 函數調用表達式語法
> _函數調用表達式_?→?[_后置表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#postfix_expression)?[_圓括號表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#parenthesized_expression)
> _函數調用表達式_?→?[_后置表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#postfix_expression)?[_圓括號表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#parenthesized_expression)?_可選_?[_后置閉包(Trailing Closure)_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#trailing_closure)
> _后置閉包(Trailing Closure)_?→?[_閉包表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#closure_expression)
### 初始化函數表達式(Initializer Expression)
Initializer表達式用來給某個Type初始化。 它的形式如下:
> `expression`.init(`initializer arguments`)
初始化函數表達式在調用函數時用來初始某個Type。 也可以使用初始化函數表達式來委托調用(delegate to )到superclass的initializers.
~~~
class SomeSubClass: SomeSuperClass {
init() {
// subclass initialization goes here
super.init()
}
}
~~~
和函數類似, 初始化表達式可以用作數值。 舉例來說:
~~~
// Type annotation is required because String has multiple initializers.
let initializer: Int -> String = String.init
let oneTwoThree = [1, 2, 3].map(initializer).reduce("", combine: +)
print(oneTwoThree)
// prints "123"
~~~
如果要用名字來指定某個type, 可以不用初始化函數表達式直接使用type的initializer。在其他情況下, 你必須使用初始化函數表達式。
~~~
let s1 = SomeType.init(data: 3) // Valid
let s2 = SomeType(data: 1) // Also valid
let s4 = someValue.dynamicType(data: 5) // Error
let s3 = someValue.dynamicType.init(data: 7) // Valid
~~~
> 構造器表達式語法
> _構造器表達式_?→?[_后置表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#postfix_expression)?.?init
### 顯式成員表達式(Explicit Member Expression)
顯示成員表達式允許我們訪問type, tuple, module的成員變量。它的形式如下:
> `expression`.`member name`
該member 就是某個type在聲明時候所定義(declaration or extension) 的變量, 例如:
~~~
class SomeClass {
var someProperty = 42
}
let c = SomeClass()
let y = c.someProperty // Member access
~~~
對于tuple, 要根據它們出現的順序(0, 1, 2...)來使用:
~~~
var t = (10, 20, 30)
t.0 = t.1
// Now t is (20, 20, 30)
~~~
對于某個module的member的調用,只能調用在top-level聲明中的member.
> 顯式成員表達式語法
> _顯示成員表達式_?→?[_后置表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#postfix_expression)?.?[_十進制數字_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#decimal_digit)
> _顯示成員表達式_?→?[_后置表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#postfix_expression)?.?[_標識符_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#identifier)?[_泛型參數子句_](http://wiki.jikexueyuan.com/project/swift/chapter3/GenericParametersAndArguments.html#generic_argument_clause)?_可選_
### 后綴self表達式(Postfix Self Expression)
后綴表達式由 某個表達式 + '.self' 組成. 形式如下:
> `expression`.self
> `type`.self
形式1 表示會返回 expression 的值。例如: x.self 返回 x
形式2:返回對應的type。我們可以用它來動態的獲取某個instance的type。
> 后置Self 表達式語法
> _后置self表達式_?→?[_后置表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#postfix_expression)?.?self
### dynamic表達式(Dynamic Type Expression)
(因為dynamicType是一個獨有的方法,所以這里保留了英文單詞,未作翻譯, --- 類似與self expression)
dynamicType 表達式由 某個表達式 + '.dynamicType' 組成。
> `expression`.dynamicType
上面的形式中, expression 不能是某type的名字(當然了,如果我都知道它的名字了還需要動態來獲取它嗎)。動態類型表達式會返回"運行時"某個instance的type, 具體請看下面的列子:
~~~
class SomeBaseClass {
class func printClassName() {
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 runtime
someInstance.dynamicType.printClassName()
// prints "SomeSubClass"
~~~
> 動態類型表達式語法
> _動態類型表達式_?→?[_后置表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#postfix_expression)?.?dynamicType
### 下標腳本表達式(Subscript Expression)
下標腳本表達式提供了通過下標腳本訪問getter/setter 的方法。它的形式是:
> `expression`[`index expressions`]
可以通過下標腳本表達式通過getter獲取某個值,或者通過setter賦予某個值.
關于subscript的聲明,請參見: Protocol Subscript Declaration.
> 附屬腳本表達式語法
> _附屬腳本表達式_?→?[_后置表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#postfix_expression)?[?[_表達式列表_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#expression_list)?]
### 強制取值表達式(Forced-Value Expression)
強制取值表達式用來獲取某個目標表達式的值(該目標表達式的值必須不是nil )。它的形式如下:
> `expression`!
如果該表達式的值不是nil, 則返回對應的值。 否則,拋出運行時錯誤(runtime error)。 返回的值可能會被需改,可以是被賦值了,也可以是出現異常造成的。比如:
~~~
var x: Int? = 0
x!++
// x is now 1
var someDictionary = ["a": [1, 2, 3], "b": [10, 20]]
someDictionary["a"]![0] = 100
// someDictionary is now [b: [10, 20], a: [100, 2, 3]]
~~~
> 強制取值(Forced Value)語法
> _強制取值(Forced Value)表達式_?→?[_后置表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#postfix_expression)?!
### 可選鏈表達式(Optional-Chaining Expression)
可選鏈表達式由目標表達式 + '?' 組成,形式如下:
> `expression`?
后綴'?' 返回目標表達式的值,把它做為可選的參數傳遞給后續的表達式
如果某個后綴表達式包含了可選鏈表達式,那么它的執行過程就比較特殊: 首先先判斷該可選鏈表達式的值,如果是 nil, 整個后綴表達式都返回 nil, 如果該可選鏈的值不是nil, 則正常返回該后綴表達式的值(依次執行它的各個子表達式)。在這兩種情況下,該后綴表達式仍然是一個optional type(In either case, the value of the postfix expression is still of an optional type)
如果某個"后綴表達式"的"子表達式"中包含了"可選鏈表達式",那么只有最外層的表達式返回的才是一個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()
}
~~~
后綴'?' 返回目標表達式的值可能會被修改,可能是由于出現了賦值,也有可能是出現異常而產生的修改。如果可選鏈表達式為`nil`,則表達式右邊的復制操作不會被執行。比如:
~~~
func someFunctionWithSideEffects() -> Int {
return 42 // No actual side effects.
}
var someDictionary = ["a": [1, 2, 3], "b": [10, 20]]
someDictionary["not here"]?[0] = someFunctionWithSideEffects()
// someFunctionWithSideEffects is not evaluated
// someDictionary is still [b: [10, 20], a: [1, 2, 3]]
someDictionary["a"]?[0] = someFunctionWithSideEffects()
// someFunctionWithSideEffects is evaluated and returns 42
// someDictionary is now [b: [10, 20], a: [42, 2, 3]]
~~~
> 可選鏈表達式語法
> _可選鏈表達式_?→?[_后置表達式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html#postfix_expression)??
- 介紹
- 歡迎使用 Swift
- 關于 Swift
- Swift 初見
- Swift 版本歷史記錄
- Swift1.0 發布內容
- Swift 教程
- 基礎部分
- 基本運算符
- 字符串和字符
- 集合類型
- 控制流
- 函數
- 閉包
- 枚舉
- 類和結構體
- 屬性
- 方法
- 下標腳本
- 繼承
- 構造過程
- 析構過程
- 自動引用計數
- 可選鏈
- 錯誤處理
- 類型轉換
- 嵌套類型
- 擴展
- 協議
- 泛型
- 權限控制
- 高級操作符
- 語言參考
- 關于語言參考
- 詞法結構
- 類型
- 表達式
- 語句
- 聲明
- 特性
- 模式
- 泛型參數
- 語法總結
- 蘋果官方Blog官方翻譯
- Access Control 權限控制的黑與白
- 造個類型不是夢-白話Swift類型創建
- WWDC里面的那個“大炮打氣球”
- Swift與C語言指針友好合作
- 引用類型和值類型的恩怨
- 訪問控制和Protected
- 可選類型完美解決占位問題