类型转换
这其实是多态。。。
swift提供了 is 和 as 两个操作符,用以检测值的类型或者转换它的类型。
class MyBasic {
var name:String
init (name:String) {
self.name = name
}
}
class MyFriend: MyBasic {
var level = 9
}
class MySelf: MyBasic {
var height = 9
}
var myArray = [
MyFriend(name: ”Hello”),
MySelf(name: ”Kitty")
]
for elem in myArray {
if elem
is MyFriend {
//
判断
elem是否是 MyFriend
类型
let obj = elem
as MyFriend
//将obj视为elem
向下转型
为MyFriend
println(“name: \(obj.name) level:\(obj.level)")
continue
}
if elem
is MySelf {
let obj = elem
as MySelf
println(“name: \(obj.name) height:\(obj.height)")
continue
}
}
上面这段,是判断了类型之后转型,但是有些时候,我们需要把判断和转型放在一条语句中执行:
let obj = myArray[0]
as? MySelf
//obj变成了可选型,转型不成功为nil
这时,obj为nil,因为myArray第一个元素不是MySelf类型。
Any 和 AnyObject 的类型转换
swift 提供了两个可以代表不确定类型的特殊类型:
AnyObject可以代表任何类的实例
Any可以代表任何类型(类型,不是实例),除了函数。
cocoa的一些api,会返回一个AnyObject类型的数组:AnyObject[] 因为Objective C中没有明确的类型的数组。
现在,将上面的myArray改一下定义:
var myArray:
AnyObject[] = [
//将数组定义为AnyObject类型
MyFriend(name: ”Hello”),
MyFriend(name: ”Kitty")
]
现在就可以这样写for了:
for elem in myArray
as MyFriend[] {
//将数组myArray看作是 MyFriend类型的数组
println(“name \(elem.name) level:\(elem.level)")
}
Any类型的就直接上官方例子了,没啥可说的:
实际上。。。也就是教学过程会这么写吧。。。项目中这么写就是脑抽:
嵌套类型
这个也没啥好说的,直接上官方例子:
使用: