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 1
,value 2
,...
]
數組中的最後一個表達式可以緊跟一個逗號(','). []表示空數組 。 array literal的type是 T[], 這個T就是數組中元素的type. 如果該數組中有多種type, T則是跟這些type的公共supertype最接近的type.(closest common supertype)
一個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).
字面量表達式語法
字面量表達式 → 字面量
字面量表達式 → 數組字面量 | 字典字面量
字面量表達式 → __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 1
:expression 1
,identifier 2
:expression 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
通配符表達式語法
通配符表達式 → _