1.用類型檢查操做符(is
)來檢查一個實例是否屬於特定子類型。若實例屬於那個子類型,類型檢查操做符返回 true
,不然返回 false
。javascript
2.某類型的一個常量或變量可能在幕後實際上屬於一個子類。當肯定是這種狀況時,你能夠嘗試向下轉到它的子類型,用類型轉換操做符(as?
或 as!
)。java
由於向下轉型可能會失敗,類型轉型操做符帶有兩種不一樣形式。條件形式(conditional form)as?
返回一個你試圖向下轉成的類型的可選值(optional value)。強制形式 as!
把試圖向下轉型和強制解包(force-unwraps)轉換結果結合爲一個操做。nginx
當你不肯定向下轉型能夠成功時,用類型轉換的條件形式(as?
)。條件形式的類型轉換老是返回一個可選值(optional value),而且若下轉是不可能的,可選值將是 nil
。這使你可以檢查向下轉型是否成功。swift
3.Swift 爲不肯定類型提供了兩種特殊的類型別名:數組
AnyObject
能夠表示任何類類型的實例。Any
能夠表示任何類型,包括函數類型。4.Swift 中的擴展能夠:函數
能夠經過擴展來擴展一個已有類型,使其採納一個或多個協議。在這種狀況下,不管是類仍是結構體,協議名字的書寫方式徹底同樣:spa
extension SomeType: SomeProtocol, AnotherProctocol {
// 協議實現寫到這裏 }
注意:擴展能夠添加新的計算型屬性,可是不能夠添加存儲型屬性,也不能夠爲已有屬性添加屬性觀察器。code
擴展能夠爲一個類型添加新的功能,可是不能重寫已有的功能。orm
若是你經過擴展爲一個已有類型添加新功能,那麼新功能對該類型的全部已有實例都是可用的,即便它們是在這個擴展定義以前建立的。ip
5.協議能夠要求採納協議的類型提供特定名稱和類型的實例屬性或類型屬性。協議不指定屬性是存儲型屬性仍是計算型屬性,它只指定屬性的名稱和類型。此外,協議還指定屬性是隻讀的仍是可讀可寫的。
協議一般用 var
關鍵字來聲明變量屬性,在類型聲明後加上 { set get }
來表示屬性是可讀可寫的,只讀屬性則用 { get }
來表示:
protocol SomeProtocol {
var mustBeSettable: Int { get set } var doesNotNeedToBeSettable: Int { get } }
在協議中定義類型屬性時,老是使用 static
關鍵字做爲前綴。當類類型採納協議時,除了 static
關鍵字,還可使用 class
關鍵字來聲明類型屬性:
protocol AnotherProtocol {
static var someTypeProperty: Int { get set } }
6.協議能夠要求採納協議的類型實現某些指定的實例方法或類方法。這些方法做爲協議的一部分,像普通方法同樣放在協議的定義中,可是不須要大括號和方法體。能夠在協議中定義具備可變參數的方法,和普通方法的定義方式相同。可是,不支持爲協議中的方法的參數提供默認值。
protocol SomeProtocol { static func someTypeMethod() }
7.儘管協議自己並未實現任何功能,可是協議能夠被當作一個成熟的類型來使用。
協議能夠像其餘普通類型同樣使用,使用場景以下: