Swift类型转换
类型转换可以判断实例的类型,也可以用于检测实例类型是否属于父类或子类的实例
类型转换用as
操作符,检测值的类型用is
类型转换还可以用来检查一个类是否实现了某个协议
例:
class Subjects {
var physics:String
init(physice:String){
self.physics = physice
}
}
class Chemistry:Subjects {
var equations:String
init(physics:String,equations:String) {
self.equations = equations
super.init(physice: physics)
}
}
class Maths:Subjects{
var formulae:String
init(physics:String,formulae:String){
self.formulae = formulae
super.init(physice: physics)
}
}
类型检测、类型转换
is
来检查一个实例是否属于特定子类型。若实例属于那个子类型,类型检查操作符返回true
,否则返回false
类型转换操作符(as?
或as!
)
当不确定向下转型可以成功时,用
类型转换的条件形式(as?)
。条件形式的类型转换总是返回一个可选值(optional value)
,并且若下转是不可能的,可选值将是 nil。
只有
可以确定向下转型一定会成功时
,才使用强制形式(as!)
。当你试图向下转型为一个不正确的类型时,强制形式的类型转换会触发一个运行时错误
let exampleArr = [Maths(physics: "微分方程", formulae: "余弦级数"),
Chemistry(physics: "固体物理", equations: "赫兹"),
Maths(physics: "天体物理学", formulae: "光年"),
Chemistry(physics: "热物理学", equations: "分贝"),
Maths(physics: "高等数学", formulae: "微积分")]
//计数
var chemCount = 0
var mathsCount = 0
func exampleFunc(){
for item in exampleArr {
//Chemistry类型检查
if item is Chemistry {
chemCount += 1
//Maths类型检查
}else if item is Maths {
mathsCount += 1
}
}
print("化学科目包含 \(chemCount) 个主题,数学包含 \(mathsCount) 个主题")
for item in exampleArr {
//类型转换的条件形式(as?)
if let conditionsItem = item as? Chemistry {
print("物理主题是:\(conditionsItem.physics),\(conditionsItem.equations)")
}else if let forceItem = item as? Maths {
print("数学主题是:\(forceItem.physics),\(forceItem.formulae)")
}
}
}
调用结果
化学科目包含 2 个主题,数学包含 3 个主题
数学主题是:微分方程,余弦级数
物理主题是:固体物理,赫兹
数学主题是:天体物理学,光年
物理主题是:热物理学,分贝
数学主题是:高等数学,微积分
Any类型转换
Swift中为不确定类型提供了两种特殊的类型别名:
• Any
可以表示任何类型,包括方法类型(function types)
∙AnyObject
可以代表任何class类型的实例
只有当明确的需要它的行为和功能时才使用Any和AnyObject。在代码里使用期望的明确的类型总是更好的。
//可以存储Any类型的数组
var anyExampleArr:[Any] = [Maths(physics: "微分方程", formulae: "余弦级数"),
Chemistry(physics: "固体物理", equations: "赫兹"),
10000,
Maths(physics: "天体物理学", formulae: "光年"),
Chemistry(physics: "热物理学", equations: "分贝"),
Maths(physics: "高等数学", formulae: "微积分"),
3.1415,
"hello word"]
func anyTypeFunc(){
for item in anyExampleArr {
switch item {
case let itemInt as Int:
print("整型值\(itemInt)")
case let itemDouble as Double:
print("浮点型值\(itemDouble)")
case let itemMaths as Maths:
print("Maths类型\(itemMaths.physics)")
case let itemChemistry as Chemistry:
print("Chemistry类型\(itemChemistry.physics)")
default:
print("none")
}
}
}
调用结果
Maths类型 微分方程
Chemistry类型 固体物理
整型值 10000
Maths类型 天体物理学
Chemistry类型 热物理学
Maths类型 高等数学
浮点型值 3.1415
none
AnyObject类型转换
//AnyObject
let anyObjectArr:[AnyObject] = [Maths(physics: "微分方程", formulae: "余弦级数"),
Chemistry(physics: "固体物理", equations: "赫兹"),
Maths(physics: "天体物理学", formulae: "光年"),
Chemistry(physics: "热物理学", equations: "分贝"),
Maths(physics: "高等数学", formulae: "微积分")]
func anyObjectTypeFunc(){
for itema in anyObjectArr{
if let someItem = itema as? Maths{
print("Maths类型\(someItem.physics)")
}else if let chemistryItem = itema as? Chemistry {
print("Chemistry类型\(chemistryItem.physics)")
}else {
print("其他\(itema)")
}
}
}
调用结果
Maths类型 微分方程
Chemistry类型 固体物理
Maths类型 天体物理学
Chemistry类型 热物理学
Maths类型 高等数学
网友评论