Swift後綴表達式
後綴表達式(Postfix Expressions)
後綴表達式就是在某個表達式的後麵加上 操作符。 嚴格的講,每個主要表達式(primary expression)都是一個後綴表達式
Swift 標準庫提供了下列後綴表達式:
- ++ Increment
- -- Decrement
對於這些操作符的使用,請參見: Basic Operators and Advanced Operators
後置表達式語法
後置表達式 → 主表達式
後置表達式 → 後置表達式 後置運算符
後置表達式 → 函數調用表達式
後置表達式 → 構造器表達式
後置表達式 → 顯示成員表達式
後置表達式 → 後置self表達式
後置表達式 → 動態類型表達式
後置表達式 → 下標表達式
後置表達式 → 強製取值(Forced Value)表達式
後置表達式 → 可選鏈(Optional Chaining)表達式
函數調用表達式(Function Call Expression)
函數調用表達式由函數名和參數列表組成。它的形式如下:
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 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}
函數調用表達式語法
函數調用表達式 → 後置表達式 圓括號表達式
函數調用表達式 → 後置表達式 圓括號表達式 可選 後置閉包(Trailing Closure)
後置閉包(Trailing Closure) → 閉包表達式
初始化函數表達式(Initializer Expression)
Initializer表達式用來給某個Type初始化。 它的形式如下:
expression
.init(initializer arguments
)
(Initializer表達式用來給某個Type初始化。) 跟函數(function)不同, initializer 不能返回值。
var x = SomeClass.someClassFunction // ok
var y = SomeClass.init // error
可以通過 initializer 表達式來委托調用(delegate to )到superclass的initializers.
class SomeSubClass: SomeSuperClass {
init() {
// subclass initialization goes here
super.init()
}
}
構造器表達式語法
構造器表達式 → 後置表達式 . 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)
The members of a module access the top-level declarations of that module. (不確定:對於某個module的member的調用,隻能調用在top-level聲明中的member.)
顯式成員表達式語法
顯示成員表達式 → 後置表達式 . 十進製數字
顯示成員表達式 → 後置表達式 . 標識符 泛型參數子句 可選
後綴self表達式(Postfix Self Expression)
後綴表達式由 某個表達式 + '.self' 組成. 形式如下:
expression
.self
type
.self
形式1 表示會返回 expression 的值。例如: x.self 返回 x
形式2:返回對應的type。我們可以用它來動態的獲取某個instance的type。
後置Self 表達式語法
後置self表達式 → 後置表達式 . 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"
動態類型表達式語法
動態類型表達式 → 後置表達式 . dynamicType
下標腳本表達式(Subscript Expression)
下標腳本表達式提供了通過下標腳本訪問getter/setter 的方法。它的形式是:
expression
[index expressions
]
可以通過下標腳本表達式通過getter獲取某個值,或者通過setter賦予某個值.
關於subscript的聲明,請參見: Protocol Subscript Declaration.
強製取值表達式(Forced-Value Expression)
強製取值表達式用來獲取某個目標表達式的值(該目標表達式的值必須不是nil )。它的形式如下:
expression
!
如果該表達式的值不是nil, 則返回對應的值。 否則,拋出運行時錯誤(runtime error)。
強製取值(Forced Value)語法
強製取值(Forced Value)表達式 → 後置表達式 !
可選鏈表達式(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()
}
可選鏈表達式語法
可選鏈表達式 → 後置表達式 ?