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作为强转操作符, 将基类引用转换为派生类引用。
基类:
- classMediaItem{
- varname:String
- init(name:String){
- self.name=name
- }
- }
2个MediaItem的派生类(注意:在Swift中先初始化派生类的成员变量,然后再执行父类的构造函数):
copy
classMovie:MediaItem{
vardirector:String
init(name:String,director:String){
self.director=director
super.init(name:name)
}
classSong:MediaItem{
varartist:String
self.artist=artist
}
声明一个数组,包含基类和派生类的对象, 那么该数组的数据类型是
基类
。
copy
letlibrary=[
Movie(name:"Casablanca",director:"MichaelCurtiz"),
Song(name:"BlueSuedeShoes",artist:"ElvisPresley"),
Movie(name:"CitizenKane",director:"OrsonWelles"),108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> Song(name:"TheOneAndOnly",artist:"ChesneyHawkes"),248)"> Song(name:"NeverGonnaGiveYouUp",artist:"RickAstley")
]
copy
iflibraryis[MediaItem]{
print("library'stypeis[MediaItem]")
}
输出:
library's type is [MediaItem]
说明: library数组相当于[MediaItem]类型的数组。
上面提到了is关键字的用法, 跟Java的instanceof完全一样。 请注意is关键字不仅在判断当前类返回true,所有的父类也同样返回true。参看示例代码:
copy
varsong=Song(name:"zhangsan",artist:"zhuanji")
ifsongisMediaItem{
print("songisinheritbyMediaItem")
ifsongisSong{
print("songisobjectofSong")
输出:
song is inherit by MediaItem
song is object of Song
Swift提供了as?和as!作为类型强转的操作符, 用法类似于try?和try!。
as?是可选类型,如果对象属于这个类那么强转为对应的引用,否则返回nil。
as!是强制类型转换,如果转换失败则会出现运行时错误。
copy
varobjSong=Song(name:"li",artist:"wu")
ifletparam=objSongas?Song{
print("objSongisfromSong")
ifletparam=objSongas?Movie{
print("objSongisfromMovie")
ifletparam=objSongas?MediaItem{
print("objSongisfromMediaItem")
输出:
objSong is from Song
objSong is from MediaItem
如果将as?改成as!会怎样?
copy
do{
tryobjSongas!Movie
}catch{
print("objSongisnotfromMovie")
前面提到as!如果转换失败时会导致运行时错误, 而且捕获不到异常。 即使像上面这样写仍然会出现运行时错误!
Swift提供了2种通用数据类型, 作用类似于Java的Object和OC的NSObject。
Any: 可以指向所有的数据类型,甚至包含函数类型;
AnyObject:可以指向所有的类对象;
copy
varthings=[Any]()
things.append(0)
things.append(0.0)
42)
3.14159)
things是可以插入所有数据类型的数组。
Swift还提供关键字as,作用类似于is,即判断数据类型。示例代码:
copy
forthinginthings{
switchthing{
case0asInt:
print("zeroasanInt")
0asDouble:
print("zeroasaDouble")
caseletsomeIntasInt:
print("anintegervalueof(someInt)")
default:
print("somethingelse")
输出:
copy
//anintegervalueof42
类似于捕获崩溃的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中。 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|