在Swift中一般使用 is 关键字实现类型检查,使用 as关键字实现类型转换。
为类型转换定义类层次
下面定义了三个类:Person、Chinese和American。Chinese 和 American 是 Person的子类。
代码示例:
先定义一个 Person基类
class Person {
var weight:Float
init(weight:Float) {
self.weight = weight
}
}
再定义两个Person的子类
class Chinese: Person {
var name:String = "张三"
init(name:String,weight:Float) {
super.init(weight: weight)
self.name = name
}
}
class American: Person {
var age:Int = 30
init(age:Int,weight:Float) {
super.init(weight: weight)
self.age = age
}
}
最后创建一个名为 People的数组,包含两个 Chinese实例和两个 American实例。
People数组的类型是在初始化的时候根据包含的实例推断出来,Swift类型检查器可以推断 Chinese和 American有一个共同的父类 Person,所以 People的类型推断为 [Person]。
let People = [
Chinese(name: "张三", weight: 50.0),
American(age: 30, weight: 60.0),
Chinese(name: "李四", weight: 55.0),
American(age: 40, weight: 65.0)
]
// "People" 的类型被推断为[Person]
类型检查
通过类型检查操作符 ( is )来检查一个实例是否属于一个特定的子类。
如果实例是该子类类型,类型检查操作符返回 true ,否则返回 false 。
代码示例
var ChineseCount = 0
var AmericanCount = 0
for people in People {
if people is Chinese {
ChineseCount += 1
} else if item is American {
AmericanCount += 1
}
}
类型转换
as 和 is相比,除了可以检查类型外,还可以访问子类的属性或方法。
代码示例
for person in Person {
if let chi = person as? Chinese {
print(chi.name)
} else if let ame = person as? American {
print(ame.age)
}
}
网友评论