Swift教學
Swift快速入門
Swift簡介
Swift基礎
Swift常量和變量
Swift註釋
swift分號
Swift整數
Swift浮點數
Swift類型安全和類型推斷
swift數值型字面量
Swift數值型類型轉換
Swift類型別名
Swift布爾值
Swift元組
Swift可選類型
Swift斷言
Swift基本運算符
Swif哈希集合
Swift運算術語
Swift字典
Swift賦值運算符
Swift數值運算
Swift複合賦值
Swift比較運算
Swift三元條件運算
Swift區間運算符
Swift邏輯運算
Swift字符串和字符
Swift字符串字面量
Swift初始化空字符串
Swift字符串可變性
Swift字符串是值類型
Swift使用字符
Swift計算字符數量
Swift連接字符串和字符
Swift字符串插值
Swift比較字符串
Swift大寫和小寫字符串
Swift Unicode
Swift集合類型 (Collection Types)
Swift數組
Swift字典
Swift集合的可變性
Swift控制流
Swift For循環
Swift While循環
Swift條件語句
Swift控制轉移語句
Swift函數
Swift函數的定義與調用
Swift函數參數與返回值
Swift函數參數名稱
Swift函數類型
Swift嵌套函數
Swift閉包
Swift閉包表達式
Swift尾隨閉包
Swift捕獲值
Swift閉包是引用類型
Swift枚舉
Swift枚舉語法
Swift匹配枚舉值和Switch語句
Swift相關值
Swift原始值
Swift類和結構體
Swift類和結構體對比
Swift結構體和枚舉是值類型
Swift類是引用類型
Swift類和結構體的選擇
Swift集合(Collection)類型的賦值和拷貝行爲
Swift屬性
Swift存儲屬性
Swift計算屬性
Swift屬性監視器
Swift全局變量和局部變量
Swift類型屬性
Swift方法
Swift實例方法
Swift類型方法
Swift下標腳本
Swift下標腳本語法
Swift下標腳本用法
Swift下標腳本選項
Swift繼承
Swift定義一個基類
Swift子類生成
Swift重寫
Swift防止重寫
Swift構造過程
Swift存儲型屬性的初始賦值
Swift定製化構造過程
Swift默認構造器
Swift值類型的構造器代理
Swift類的繼承和構造過程
Swift通過閉包和函數來設置屬性的默認值
Swift析構過程
Swift析構過程原理
Swift析構函數操作
Swift自動引用計數
Swift自動引用計數的工作機制
Swift自動引用計數實踐
Swift類實例之間的循環強引用
Swift解決實例之間的循環強引用
Swift閉包引起的循環強引用
Swift解決閉包引起的循環強引用
Swift可選鏈
Swift可選鏈可替代強制解析
Swift爲可選鏈定義模型類
Swift通過可選鏈調用屬性
Swift通過可選鏈調用方法
Swift使用可選鏈調用子腳本
Swift連接多層鏈接
Swift鏈接可選返回值的方法
Swift類型轉換
Swift定義一個類層次作爲例子
Swift檢查類型
Swift向下轉型
Swift Any和AnyObject類型轉換
Swift嵌套類型
Swift嵌套類型實例
Swift嵌套類型的引用
Swift擴展
Swift擴展語法
Swift計算型屬性
Swift構造器
Swift方法擴展
Swift下標
Swift嵌套類型擴展
Swift協議
Swift協議的語法
Swift屬性要求
Swift方法要求
Swift突變方法要求
Swift協議類型
Swift委託(代理)模式
Swift在擴展中添加協議成員
Swift通過擴展補充協議聲明
Swift集合中的協議類型
Swift協議的繼承
Swift協議合成
Swift檢驗協議的一致性
Swift可選協議要求
Swift泛型
Swift泛型所解決的問題
Swift泛型函數
Swift類型參數
Swift命名類型參數
Swift泛型類型
Swift類型約束
Swift關聯類型
Swift Where語句
Swift高級運算符
Swift位運算符
Swift溢出運算符
Swift優先級和結合性
Swift運算符函數
Swift自定義運算符
Swift語法結構
Swift空白與註釋
Swift標識符
Swift關鍵字
Swift字面量
Swift運算符
Swift類型
Swift類型註解
Swift類型標識符
Swift元組類型
Swift函數類型(參數類型和返回值類型)
Swift數組類型
Swift可選類型(命名型類型)
Swift隱式解析可選類型
Swift協議合成類型
Swift元類型
Swift類型繼承子句
Swift類型推斷
Swift表達式
Swift前綴表達式
Swift二元表達式
Swift賦值表達式
Swift類型轉換運算符
Swift主表達式
Swift後綴表達式
Swift語句
Swift循環語句
Swift For語句
Swift分支語句
Swift帶標籤的語句
Swift聲明
Swift模塊範圍
Swift代碼塊
Swift引入聲明
Swift常量聲明
Swift類型的別名聲明
Swift函數聲明
Swift枚舉聲明
Swift結構體聲明
Swift類聲明
Swift協議聲明
Swift構造器聲明
Swift析構聲明
Swift擴展聲明
Swift下標腳本聲明
Swift運算符聲明
Swift變量聲明
Swift特性
Swift聲明特性
Swift類型特性
Swift模式
Swift通配符模式
Swift標識符模式
Swift值綁定模式
Swift元組模式
Swift枚舉用例模式
Swift類型轉換模式
Swift表達式模式
Swift泛型參數
Swift泛型形參子句
Swift開發環境設置
Swift基本語法
Swift數據類型
Swift變量
Swift常量
Swift字面量
Swift運算符
Swift比較運算符
Swift邏輯運算符
Swift位運算符
Swift賦值運算符
Swift範圍運算符
Swift其它運算符
Swift運算符優先級
Swift算術運算符
Swift if語句
Swift if...else語句
Swift if...else if...else語句
Swift嵌套 if 語句
Swift Switch語句
Swift決策
Swift for-in循環
Swift for循環
Swift while循環
Swift do...while循環
Swift continue語句
Swift break語句
Swift fallthrough語句
Swift循環
Swift字符串
Swift字符
Swift數組
Swift函數
Swift閉包
Swift枚舉
Swift結構體
Swift類
Swift 屬性
Swift 方法
Swift 下標
Swift 繼承
Swift初始化
Swift 反初始化
Swift ARC自動引用計數
Swift 可選鏈
Swift 類型轉換
Swift 擴展
Swift 協議
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()
}

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