- 类型转换是指任意两个对象之间相互转换。
- 这些类型可以是通过集成的父子关系,也可以是协议的耦合关系,甚至可以是任意类型之间的转换。
1、子类的对象赋值为基类
// 原型类
class Entity{
var name = ""
init(entityName:String) {
self.name = entityName
}
func showTag() {
}
}
// 人物类
class Hero:Entity{
var race = ""
override func showTag() {
print("我是一个英雄")
}
}
// 怪物类
class Monster:Entity{
var level = 0
override func showTag() {
print("我要吃了你")
}
}
var hero:Entity = Hero(entityName: "火女")
hero.showTag()
var monster:Entity = Monster(entityName: "远古野")
monster.showTag()
- 这里面指定一个对象的类型为
Entity
类型,它实际创建出来的对象是Hero类型。这里的用法就是:把子类的对象转化为父类的对象。 - 对象调用方法,依旧调用该对象的方法。
2、类型检查
- 判断某个对象是不是某个类的对象,可以使用
is
关键字。 - 经过测试,
is
关键字可以检查某个对象是否是某个父类的对象。
hero is Hero // true
hero is Entity // true
hero is Monster // false
3、类型转换
var hero1 = hero as Hero
// error: 'Entity' is not convertible to 'Hero'; did you mean to use 'as!' to force downcast?
- 根据上述代码,可以发现父类不能转化为子类,可以使用
as!
进行类型的强制向下转换。 - 同时,
Swift
也提供了另外一个关键字as?
,此关键字表示可以进行类型转换,但不一定能够成功,如果不成功,则返回nil
。
var monster1 = hero as? Monster // 转换失败,返回nil
4、Any
和AnyObject
类型转换
Any
类型可以表示任意类型,包括基本数据类型或者类的对象。
var arrayOne = Array<Any>()
arrayOne.append(1)
arrayOne.append(1.2)
arrayOne.append("hello")
for item in arrayOne {
print(item)
}
/*
1
1.2
hello
*/
- 如果将一个变量设置为Any类型,那么该变量可以接收任何类型的值。
var any:Any = 1
print(any)
any = "2"
print(any)
any = 3.01
print(any)
AnyObject
表示任何对象,但不包括Int,Long,Float
等类型。AnyObject
用法与Any
用法类似。
var arrayOne = Array<AnyObject>()
arrayOne.append(hero)
arrayOne.append(monster)
// arrayOne.append("4444") // 报错 error: argument type 'String' does not conform to expected type 'AnyObject'
for item in arrayOne {
print(item)
}
var any:AnyObject = monster
print(any)
any = hero
print(any)
// any = "3333" // 这种情况将会报错,error: value of type 'String' does not conform to 'AnyObject' in assignment