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
属性能够被访问。