/* TypeCase
1.downcast 向下转换将一个父类类型的变量(可能本来时子类类型,在之前的运算中被转换成父类)
转换为子类类型的变量
2.upcast 与之相反。
3.不是继承关系的类不可以转换。
4.as 与 as? 的区别:as?返回的时optional的。as可以向上转换也可以向下
AnyObject 可以任何类的类型的实例,由于OC没有指定类型的数组,所以swift给OC传递数组时,需要转换成此类型。
Any可以代替除了函数类型以外的任意类型✨可以用Any来定义任意类型的数组
✨注意AnyObject只能时类实例,而Any可以是任意的类型(除函数)
5.可以在switch中用is和as操作
*/
class Animal
{
var caneat = true
}
class Bird: Animal
{
var canfly = true
}
class Fish: Animal
{
var canswim = true
}
var a =Animal()
var b =Bird()
// if a is Bird 这个是恒等于false的
// if b is Bird 这个是恒等于true的。
// if b is Animal //编译错误
//在定义下面的数组时,arry被推导为Animal类型的数组,因为Bird也是Animal的子类。
var arry = [Fish(),Bird()]
for i in arry
{
if i is Fish
{
println("fish")
}
else if i is Bird
{
println("Bird")
}
else
{
println("other")
}
}
//类型强转,子类转化为父类
println(b.canfly)
var c = b as Animal
//println(c.canfly) 转化后就成了父类的类型,不再拥有属性canfly
var d = cas Bird //转换后可以转换回来
println(d.canfly)
//var f = b as Fish 不是继承关系的类不可以转换。
// as 与 as? 的区别:as?返回的时optional的。
var f = arry[1] as? Fish
if f != nil //beta5之后不能用if nil的语句啦。
{
println("optional f is Fish")
}
else
{
println("optional f is not Fish")
}
// 由于OC没有指定类型的数组,所以swift给OC传递数组时,需要转换成AnyObject的。
var myAnyArray:[AnyObject] = [Fish(),Fish()] //两个Fish变量的数组
//在还原时,如果确信都是Fish则可以用as,如果不确信则可以用as?
for item in myAnyArray
{
println("In my AnyArray item can swim\((item as Fish).canswim)")
}
//可以在switch中用is和as操作,用Any定义任意类型的数组
var anyTypeArray:[Any] = [0, 0.0,Fish(), "Hello"]
for item inanyTypeArray
{
switch item
{
case 0 as Int://如果不需要获取变量可以直接这样写
println("Int var")
case let d as Double://需要截获变量的写法
println("Double var is\(d)")
case let m as Fish:
println("Fish can swim")
default:
println("other")
}
}
//《完》