发布于 2015-06-14 01:56:15 | 147 次阅读 | 评论: 0 | 来源: 网络整理
使用is检验协议一致性,使用as将协议类型向下转换(downcast)为的其他协议类型。检验与转换的语法和之前相同(详情查看类型检查):
is操作符用来检查实例是否遵循了某个协议。as?返回一个可选值,当实例遵循协议时,返回该协议类型;否则返回nilas用以强制向下转换型。
@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属性能够被访问。