Swift3.0 - Type Casting 类型转换
http://blog.csdn.net/brycegao321/article/details/53311964
https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html#//apple_ref/doc/uid/TP40014097-CH22-ID338
类型转换包括判断对象的基类和将基类引用转换为派生类引用。 Swift使用is判断当前对象是否为某个类的对象, 作用同Java的instanceof关键字; Swift使用as作为强转操作符, 将基类引用转换为派生类引用。
基类:
- 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
如果将as?改成as!会怎样?
- 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:
- print("zero as an Int")
- case 0 as Double:
- print("zero as a Double")
- case let someInt as Int:
- print("an integer value of \(someInt)")
- default:
- print("something else")
- }
- }
输出:
类似于捕获崩溃的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中。