https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html#//apple_ref/doc/uid/TP40014097-CH22-ID338
基类:
class MediaItem {
var name: String
init(name: String) {
self.name = name
}
}
2个MediaItem的派生类(注意:在Swift中先初始化派生类的成员变量,然后再执行父类的构造函数):
class Movie: MediaItem {
var director: String
init(name: String, director: String) {
self.director = director
super.init(name: name)
}
}
class Song: MediaItem {
var artist: String
init(name: String, artist: String) {
self.artist = artist
super.init(name: name)
}
}
声明一个数组,包含基类和派生类的对象, 那么该数组的数据类型是 基类。
let library = [
Movie(name: "Casablanca", director: "Michael Curtiz"),
Song(name: "Blue Suede Shoes", artist: "Elvis Presley"),
Movie(name: "Citizen Kane", director: "Orson Welles"),
Song(name: "The One And Only", artist: "Chesney Hawkes"),
Song(name: "Never Gonna Give You Up", artist: "Rick Astley")
]
if library is [MediaItem] {
print("library's type is [MediaItem]")
}
输出:
library's type is [MediaItem]
说明: library数组相当于[MediaItem]类型的数组。
上面提到了is关键字的用法, 跟Java的instanceof完全一样。 请注意is关键字不仅在判断当前类返回true,所有的父类也同样返回true。参看示例代码:
var song = Song(name: "zhangsan", artist: "zhuanji")
if song is MediaItem {
print("song is inherit by MediaItem")
}
if song is Song {
print("song is object of Song")
}
输出:
song is inherit by MediaItem
song is object of Song
Swift提供了as?和as!作为类型强转的操作符, 用法类似于try?和try!。
as?是可选类型,如果对象属于这个类那么强转为对应的引用,否则返回nil。
as!是强制类型转换,如果转换失败则会出现运行时错误。
var objSong = Song(name: "li", artist: "wu")
if let param = objSong as? Song {
print("objSong is from Song")
}
if let param = objSong as? Movie {
print("objSong is from Movie")
}
if let param = objSong as? MediaItem {
print("objSong is from MediaItem")
}
输出:
objSong is from Song
objSong is from MediaItem
do {
try objSong as! Movie
} catch {
print("objSong is not from Movie")
}
前面提到as!如果转换失败时会导致运行时错误, 而且捕获不到异常。 即使像上面这样写仍然会出现运行时错误!
Swift提供了2种通用数据类型, 作用类似于Java的Object和OC的NSObject。
Any: 可以指向所有的数据类型,甚至包含函数类型;
AnyObject:可以指向所有的类对象;
var things = [Any]()
things.append(0)
things.append(0.0)
things.append(42)
things.append(3.14159)
things是可以插入所有数据类型的数组。
Swift还提供关键字as,作用类似于is,即判断数据类型。示例代码:
for thing in things {
switch thing {
case 0 as Int: //可理解成“作为整型的数值0”
print("zero as an Int")
case 0 as Double: //“作为浮点型的数值0”
print("zero as a Double")
case let someInt as Int:
print("an integer value of \(someInt)")
default:
print("something else")
}
}
输出:
// zero as an Int
// zero as a Double
// an integer value of 42
类似于捕获崩溃的try、try?和try!, 类型转换操作符是as、as?和as!;二者逻辑是一样的,问号表示可选数据类型,感叹号表示强制执行。
小结:
1、Swift使用is判断属于某个类, 作用同Java的instanceof;
2、Swift使用Any表示所有数据类型、AnyObject表示所有类对象类型;类似于Java的Oject和OC的NSObject。
3、使用as?和as!做数据类型强转,as用于判断是否某个数据类型。
4、as和is关键字的作用有点像,但不能相互替代。 is可用于if判断条件中, as可理解为“作为**数据类型”并且多用于switch/case中。