位置:首頁 > 高級語言 > Swift教學 > Swift後綴表達式

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 1argument value 2)

The function name can be any expression whose value is of a function type. (不用翻譯了, 太羅嗦)

如果該function 的聲明中指定了參數的名字,那麼在調用的時候也必須得寫出來. 例如:

function name(argument name 1argument value 1argument 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()
}


可選鏈表達式語法
可選鏈表達式 → 後置表達式 ?