Swift3.0 - 类型转换

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作为强转操作符, 将基类引用转换为派生类引用。

基类:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. class MediaItem {  
  2.     var name: String  
  3.     init(name: String) {  
  4.         self.name = name  
  5.     }  
  6. }  
2个MediaItem的派生类(注意:在Swift中先初始化派生类的成员变量,然后再执行父类的构造函数):

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. class Movie: MediaItem {  
  2.     var director: String  
  3.     init(name: String, director: String) {  
  4.         self.director = director  
  5.         super.init(name: name)  
  6.     }  
  7. }  
  8.    
  9. class Song: MediaItem {  
  10.     var artist: String  
  11.     init(name: String, artist: String) {  
  12.         self.artist = artist  
  13.         super.init(name: name)  
  14.     }  
  15. }  

声明一个数组,包含基类和派生类的对象, 那么该数组的数据类型是 基类

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. let library = [  
  2.     Movie(name: "Casablanca", director: "Michael Curtiz"),  
  3.     Song(name: "Blue Suede Shoes", artist: "Elvis Presley"),  
  4.     Movie(name: "Citizen Kane", director: "Orson Welles"),  
  5.     Song(name: "The One And Only", artist: "Chesney Hawkes"),  
  6.     Song(name: "Never Gonna Give You Up", artist: "Rick Astley")  
  7. ]  

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. if library is [MediaItem] {  
  2.     print("library's type is [MediaItem]")  
  3. }  
输出:  library's type is [MediaItem]

说明: library数组相当于[MediaItem]类型的数组。


上面提到了is关键字的用法, 跟Java的instanceof完全一样。 请注意is关键字不仅在判断当前类返回true,所有的父类也同样返回true。参看示例代码:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. var song = Song(name: "zhangsan", artist: "zhuanji")  
  2. if song is MediaItem {  
  3.     print("song is inherit by MediaItem")  
  4. }  
  5. if song is Song {  
  6.     print("song is object of Song")  
  7. }  
输出:

song is inherit by MediaItem

song is object of Song



Swift提供了as?和as!作为类型强转的操作符, 用法类似于try?和try!。

as?是可选类型,如果对象属于这个类那么强转为对应的引用,否则返回nil。

as!是强制类型转换,如果转换失败则会出现运行时错误。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. var objSong = Song(name: "li", artist: "wu")  
  2.   
  3. if let param = objSong as? Song {  
  4.     print("objSong is from Song")  
  5. }  
  6.   
  7. if let param = objSong as? Movie {  
  8.     print("objSong is from Movie")  
  9. }  
  10.   
  11. if let param = objSong as? MediaItem {  
  12.     print("objSong is from MediaItem")  
  13. }  
输出:

objSong is from Song

objSong is from MediaItem


如果将as?改成as!会怎样?

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. do {  
  2.     try objSong as! Movie  
  3. catch {  
  4.     print("objSong is not from Movie")  
  5. }  
前面提到as!如果转换失败时会导致运行时错误, 而且捕获不到异常。 即使像上面这样写仍然会出现运行时错误!


Swift提供了2种通用数据类型, 作用类似于Java的Object和OC的NSObject。

Any: 可以指向所有的数据类型,甚至包含函数类型;

AnyObject:可以指向所有的类对象;

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. var things = [Any]()  
  2.    
  3. things.append(0)  
  4. things.append(0.0)  
  5. things.append(42)  
  6. things.append(3.14159)  
things是可以插入所有数据类型的数组。

Swift还提供关键字as,作用类似于is,即判断数据类型。示例代码:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. for thing in things {  
  2.     switch thing {  
  3.     case 0 as Int:  //可理解成“作为整型的数值0”  
  4.         print("zero as an Int")  
  5.     case 0 as Double:  //“作为浮点型的数值0”  
  6.         print("zero as a Double")  
  7.     case let someInt as Int:  
  8.         print("an integer value of \(someInt)")  
  9.     default:  
  10.         print("something else")  
  11.     }  
  12. }  
输出:
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // zero as an Int  
  2. // zero as a Double  
  3. // 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中。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值