Swift檢驗協議的一致性
檢驗協議的一致性
使用is
檢驗協議一致性,使用as
將協議類型向下轉換(downcast)
為的其他協議類型。檢驗與轉換的語法和之前相同(詳情查看類型檢查):
-
is
操作符用來檢查實例是否遵循
了某個協議
。 -
as?
返回一個可選值,當實例遵循
協議時,返回該協議類型;否則返回nil
-
as
用以強製向下轉換型。
@objc protocol HasArea {
var area: Double { get }
}
注意:@objc
用來表示協議是可選的,也可以用來表示暴露給Objective-C
的代碼,此外,@objc
型協議隻對類
有效,因此隻能在類
中檢查協議的一致性。詳情查看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
協議,前者把area
寫為計算型屬性(computed property),後者則把area
寫為存儲型屬性(stored property)。
如下所示,Animal
類冇有實現任何協議
class Animal {
var legs: Int
init(legs: Int) { self.legs = legs }
}
Circle,Country,Animal
並冇有一個相同的基類,所以采用AnyObject
類型的數組來裝載在它們的實例,如下所示:
let objects: AnyObject[] = [
Circle(radius: 2.0),
Country(area: 243_610),
Animal(legs: 4)
]
如下所示,在迭代時檢查object
數組的元素是否遵循
了HasArea
協議:
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
當數組中的元素遵循HasArea
協議時,通過as?
操作符將其可選綁定(optional binding)
到objectWithArea
常量上。
objects
數組中元素的類型並不會因為向下轉型
而改變,當它們被賦值給objectWithArea
時隻被視為HasArea
類型,因此隻有area
屬性能夠被訪問。