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中。