使用is檢驗(yàn)協(xié)議一致性,使用as將協(xié)議類型向下轉(zhuǎn)換(downcast)為的其他協(xié)議類型。檢驗(yàn)與轉(zhuǎn)換的語(yǔ)法和之前相同(詳情查看類型檢查):
is操作符用來(lái)檢查實(shí)例是否遵循了某個(gè)協(xié)議。as?返回一個(gè)可選值,當(dāng)實(shí)例遵循協(xié)議時(shí),返回該協(xié)議類型;否則返回nilas用以強(qiáng)制向下轉(zhuǎn)換型。
@objc protocol HasArea {
var area: Double { get }
}
注意:@objc用來(lái)表示協(xié)議是可選的,也可以用來(lái)表示暴露給Objective-C的代碼,此外,@objc型協(xié)議只對(duì)類有效,因此只能在類中檢查協(xié)議的一致性。詳情查看Using Siwft with Cocoa and Objectivei-c。
class Circle: HasArea {
let pi = 3.1415927
var radius: Double
var area:≈radius }
init(radius: Double) { self.radius = radius }
}
class Country: HasArea {
var area: Double
init(area: Double) { self.area = area }
}
Circle和Country都遵循了HasArea協(xié)議,前者把area寫(xiě)為計(jì)算型屬性(computed property),后者則把area寫(xiě)為存儲(chǔ)型屬性(stored property)。
如下所示,Animal類沒(méi)有實(shí)現(xiàn)任何協(xié)議
class Animal {
var legs: Int
init(legs: Int) { self.legs = legs }
}
Circle,Country,Animal并沒(méi)有一個(gè)相同的基類,所以采用AnyObject類型的數(shù)組來(lái)裝載在它們的實(shí)例,如下所示:
let objects: AnyObject[] = [
Circle(radius: 2.0),
Country(area: 243_610),
Animal(legs: 4)
]
如下所示,在迭代時(shí)檢查object數(shù)組的元素是否遵循了HasArea協(xié)議:
for object in objects {
if let objectWithArea = object as? HasArea {
println("Area is \(objectWithArea.area)")
} else {
println("Something that doesn't have an area")
}
}
// Area is 12.5663708
// Area is 243610.0
// Something that doesn't have an area
當(dāng)數(shù)組中的元素遵循HasArea協(xié)議時(shí),通過(guò)as?操作符將其可選綁定(optional binding)到objectWithArea常量上。
objects數(shù)組中元素的類型并不會(huì)因?yàn)?code style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; font-size: 14px; padding: 0px 5px; color: rgb(199, 37, 78); background-color: rgb(248, 248, 248); white-space: nowrap; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; margin: 0px 2px; border: 1px solid rgb(234, 234, 234);">向下轉(zhuǎn)型而改變,當(dāng)它們被賦值給objectWithArea時(shí)只被視為HasArea類型,因此只有area屬性能夠被訪問(wèn)。