Swift廣泛的使用類型推斷,從而允許你可以忽略很多變量和表達(dá)式的類型或部分類型。比如,對于var x: Int = 0,你可以完全忽略類型而簡寫成var x = 0——編譯器會正確的推斷出x的類型Int。類似的,當(dāng)完整的類型可以從上下文推斷出來時,你也可以忽略類型的一部分。比如,如果你寫了let dict: Dictionary = ["A": 1],編譯提也能推斷出dict的類型是Dictionary<String, Int>。
在上面的兩個例子中,類型信息從表達(dá)式樹(expression tree)的葉子節(jié)點(diǎn)傳向根節(jié)點(diǎn)。也就是說,var x: Int = 0中x的類型首先根據(jù)0的類型進(jìn)行推斷,然后將該類型信息傳遞到根節(jié)點(diǎn)(變量x)。
在Swift中,類型信息也可以反方向流動——從根節(jié)點(diǎn)傳向葉子節(jié)點(diǎn)。在下面的例子中,常量eFloat上的顯式類型注解(:Float)導(dǎo)致數(shù)字字面量2.71828的類型是Float而非Double。
let e = 2.71828 // The type of e is inferred to be Double.
let eFloat: Float = 2.71828 // The type of eFloat is Float.
Swift中的類型推斷在單獨(dú)的表達(dá)式或語句水平上進(jìn)行。這意味著所有用于推斷類型的信息必須可以從表達(dá)式或其某個子表達(dá)式的類型檢查中獲取。