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

Swift主表達式

主表達式(Primary Expressions)

主表達式是最基本的表達式。 它們可以跟 前綴表達式,二元表達式,後綴表達式以及其他主要表達式組合使用。


主表達式語法
主表達式 → 標識符 泛型參數子句 可選
主表達式 → 字麵量表達式
主表達式 → self表達式
主表達式 → 超類表達式
主表達式 → 閉包表達式
主表達式 → 圓括號表達式
主表達式 → 隱式成員表達式
主表達式 → 通配符表達式
 

字符型表達式(Literal Expression)

由這些內容組成:普通的字符(string, number) , 一個字符的字典或者數組,或者下麵列表中的特殊字符。

字符(Literal) 類型(Type) 值(Value)
_FILE_ String 所在的文件名
_LINE_ Int 所在的行數
_COLUMN_ Int 所在的列數
_FUNCTION_ String 所在的function 的名字

在某個函數(function)中,__FUNCTION__ 會返回當前函數的名字。 在某個方法(method)中,它會返回當前方法的名字。 在某個property 的getter/setter中會返回這個屬性的名字。 在init/subscript中 隻有的特殊成員(member)中會返回這個keyword的名字,在某個文件的頂端(the top level of a file),它返回的是當前module的名字。

一個array literal,是一個有序的值的集合。 它的形式是:

[value 1value 2...]

數組中的最後一個表達式可以緊跟一個逗號(','). []表示空數組 。 array literal的type是 T[], 這個T就是數組中元素的type. 如果該數組中有多種type, T則是跟這些type的公共supertype最接近的type.(closest common supertype)

一個dictionary literal 是一個包含無序的鍵值對(key-value pairs)的集合,它的形式是:

[key 1value 1key 2value 2...]

dictionary 的最後一個表達式可以是一個逗號(','). [:] 表示一個空的dictionary. 它的type是 Dictionary (這裡KeyType表示 key的type, ValueType表示 value的type) 如果這個dictionary 中包含多種 types, 那麼KeyType, Value 則對應著它們的公共supertype最接近的type( closest common supertype).


字麵量表達式語法
字麵量表達式 → 字麵量
字麵量表達式 → 數組字麵量 | 字典字麵量
字麵量表達式 → __FILE__ | __LINE__ | __COLUMN__ | __FUNCTION__
數組字麵量 → [ 數組字麵量項列表 可選 ]
數組字麵量項列表 → 數組字麵量項 , 可選 | 數組字麵量項 , 數組字麵量項列表
數組字麵量項 → 表達式
字典字麵量 → [ 字典字麵量項列表 ] | [ : ]
字典字麵量項列表 → 字典字麵量項 , 可選 | 字典字麵量項 , 字典字麵量項列表
字典字麵量項 → 表達式 : 表達式
 

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 . 標識符
self表達式 → self [ 表達式 ]
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)表達式語法
超類表達式 → 超類方法表達式 | 超類下標表達式 | 超類構造器表達式
超類方法表達式 → super . 標識符
超類下標表達式 → super [ 表達式 ]
超類構造器表達式 → 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) 可選 多條語句(Statements) }
閉包簽名(Signational) → 參數子句 函數結果 可選 in
閉包簽名(Signational) → 標識符列表 函數結果 可選 in
閉包簽名(Signational) → 捕獲(Capature)列表 參數子句 函數結果 可選 in
閉包簽名(Signational) → 捕獲(Capature)列表 標識符列表 函數結果 可選 in
閉包簽名(Signational) → 捕獲(Capature)列表 in
捕獲(Capature)列表 → [ 捕獲(Capature)說明符 表達式 ]

捕獲(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


隱式成員表達式語法
隱式成員表達式 → . 標識符
 

圓括號表達式(Parenthesized Expression)

圓括號表達式由多個子表達式和逗號','組成。 每個子表達式前麵可以有 identifier x: 這樣的可選前綴。形式如下:

(identifier 1expression 1identifier 2expression 2...)

圓括號表達式用來建立tuples , 然後把它做為參數傳遞給 function. 如果某個圓括號表達式中隻有一個 子表達式,那麼它的type就是 子表達式的type。例如: (1)的 type是Int, 而不是(Int)


圓括號表達式(Parenthesized Expression)語法
圓括號表達式 → ( 表達式元素列表 可選 )
表達式元素列表 → 表達式元素 | 表達式元素 , 表達式元素列表
表達式元素 → 表達式 | 標識符 : 表達式
 

通配符表達式(Wildcard Expression)

通配符表達式用來忽略傳遞進來的某個參數。例如:下麵的代碼中,10被傳遞給x, 20被忽略(譯注:好奇葩的語法。。。)

(x, _) = (10, 20)
// x is 10, 20 is ignored


通配符表達式語法
通配符表達式 → _