(一)类型转换(type casting)

类型转换是检查类型实例的方式,也是把类型实例作为子类或者父类的方式

主要有三个关键词,is,as?,as!(as),is表示是某种类型(比如父类和子类同时出现,选择父类,就是表示层级比较大的那个类型),as表示的是向下转换(downcast)到子类本身,问号表示可选,叹号表示强拆包

举个例子:

class MediaItem {var name: Stringinit(name: String) {self.name = name}
}class Movie: MediaItem {var director: Stringinit(name: String, director: String) {self.director = directorsuper.init(name: name)}
}
<pre name="code" class="plain">        for item in library {if let movie = item as? Movie {print("name:\(movie.name), director:\(movie.director)")}else if let song = item as? Song {print("name:\(song.name), artist:\(song.artist)")}}

class Song: MediaItem { var artist: String init(name: String, artist: String) { self.artist = artist super.init(name: name) }}

        let library = [Movie(name: "张学友", director: "麦兆辉"),Song(name: "一路上有你", artist: "张学友"),Movie(name: "周星驰", director: "周星驰"),Song(name: "夕阳醉了", artist: "张学友"),Movie(name: "赌神", director: "王晶")]for item in library {if item is Movie {movieCount++}else if item is Song {songCount++}}print("Media library contains \(movieCount) movies and \(songCount) songs")

解释:

如果当前的MediaItem(item)是Movie的实例的话,就返回true,否则就返回false

而上面的item实际上是MediaItem类型,而不是真正的Movie类型,也就说你访问不到Movie的director的属性,那我们怎么才能让item实例真正是Movie本身的类型呢?这时我们就用到关键字as了,进行向下拆包

as有两种形式,一个是as?,表示返回的类型可选,一个是as!强制拆包,用这个的时候你要确保你解析的东西是正确有值的,可以解包成功的

        for item in library {if let movie = item as? Movie {print("name:\(movie.name), director:\(movie.director)")}else if let song = item as? Song {print("name:\(song.name), artist:\(song.artist)")}}

因为item是MediaItem的实例,向下可能是Movie的实例,所以用as?可选,再用一个可选绑定,如果成功,就可以访问director属性了

注意:转换实际上没有改变这个实例或者它的值,潜在的实例还是保持原来的值,它仅仅是被转换的类型的实例

(二)Any和AnyObject

AnyObject:代表任意类类型(class type)的实例

Any:可以代表任意类型的实例,除了函数类型

a.AnyObject

        let someObjects: [AnyObject] = [Movie(name: "大圣归来", director: "未知"), Movie(name: "速度与激情7", director: "温世仁"), Movie(name: "无间道", director: "刘伟强")]for item in someObjects {let movie = item as! Movieprint("name: \(movie.name),dir.\(movie.director)")}

这里你已经确定item就是Movie的实例类型,直接强拆,用一个常量接收

还有一个办法,就是既然你已经确定someObjects是一个[Movie]类型的数组,那么就可以这么写:

        for movie in someObjects as! [Movie] {print("name: \(movie.name),dir.\(movie.director)")}

b.Any

既然Any除了函数类型都能代表,那么我们就定义一个可变数组,Any型的,装它几种类型

        var things = [Any]()things.append(0)things.append(0.0)things.append(42)things.append(3.14159)things.append("hell0")things.append((3.0, 5.0))things.append(Movie(name: "恐怖游轮", director: "未知"))things.append({ (name: String) -> String in ("Hello, \(name)") })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)")case let someDouble as Double where someDouble > 0:print("a double value of \(someDouble)")case is Double:print("some other double that I don't want to print")case let someString as String:print("a string value of \(someString)")case let (x, y) as (Double, Double):print("an (x, y) point is at \(x, y)")case let movie as Movie:print("a movie called \(movie.name),dir.\(movie.director)")case let stringConverter as String -> String:print(stringConverter("xiaoyu"))default:print("something else")}}

swift2.0学习之类型转换相关推荐

  1. swift2.0 学习笔记ten

    import UIKit class Vehicle { var currentSpeed = 0.0 var description: String { return "traveling ...

  2. [EntLib]微软企业库5.0 学习之路——第五步、介绍EntLib.Validation模块信息、验证器的实现层级及内置的各种验证器的使用方法——上篇...

    本文是为后面的学习之路做铺垫,简单介绍下企业库中的Validation模块的一些相关知识,包括Validation模块的简介.用途.使用方法.默认提供的多种验证器的介绍等. 一.简介及用途 在实际的项 ...

  3. Swift2.0 中的String(一):常用属性

    字符串算是平常用的比较多.花样也比较多的一个类型,昨天有空把相关的一些常用操作都写了一遍,总结出来.其实iOS里面的字符串更复杂,还有NSString系列等等,那些API太多将来需要用的时候再慢慢学. ...

  4. Tensorflow2.0学习笔记(一)

    Tensorflow2.0学习笔记(一)--MNIST入门 文章目录 Tensorflow2.0学习笔记(一)--MNIST入门 前言 一.MNIST是什么? 二.实现步骤及代码 1.引入库 2.下载 ...

  5. mysql5.0镜像_Mysql5.0学习笔记(一)

    Mysql5.0学习笔记(一) -基本sql语句与支持字符集 1.登录 mysql -h localhost -u root 2.创建用户firstdb(密码firstdb)和数据库,并赋予权限于fi ...

  6. asp.net2.0学习历程 菜鸟到中级程序员的飞跃【月儿原创】

    asp.net2.0学习历程 菜鸟到中级程序员的飞跃 --30本好书点评 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/           时间:2007.5.1 ...

  7. Swift2.0系列]Error Handling(项目应用篇)

    1.FileManager中的应用 倘若你只是想看FileManager中的 Error Handling是如何实现的,请找到3.删除文件以及4.获取文件信息.我分别为你提供了do-catch以及tr ...

  8. Swift2.0语言教程之类的嵌套与可选链接

    Swift2.0语言教程之类的嵌套与可选链接 Swift2.0语言类的嵌套 在一个类中可以嵌套一个或者多个类.它们的嵌套形式也是不同的,大致分为了两种:直接嵌套和多次嵌套.下面依次讲解这两种方式. S ...

  9. Swift2.0语言教程之下标脚本

    Swift2.0语言教程之下标脚本 下标脚本 下标脚本是访问对象.集合或者序列的快速方式.开发者不需要调用实例特定的赋值和访问方法,就可以直接访问所需要的数值.例如在数组中,可以直接使用下标去访问或者 ...

最新文章

  1. xfs_repair 实际工作中的问题
  2. 北理工计算机原理与应用实验,北理工计算机原理与应用实验三教程.docx
  3. 机会只留给有准备的人
  4. 90页Numpy精华、算法刷题44天等内容整理
  5. UbbCode用正则替换指定格式的输入实现想要的输出
  6. 这个转录组比对工具很快,十几分钟一个样品
  7. 不可不知的CSS小技巧
  8. 激活函数active function
  9. python_程序的构成---python工作笔记015
  10. Django ORM 单表操作
  11. python tkinter
  12. java多线程通信 例子
  13. Linux信号量详解
  14. php镜像站群_【镜像站群系统】2020最新单域名PHP网站克隆镜像网站程序源码
  15. rar压缩包密码解密
  16. ISAC(internet Speech Audio Codec):
  17. ICO走进华盛顿:国会探讨加密货币,有什么可以期待?
  18. Atlassian Bamboo 安装
  19. 批处理设置计算机不休眠,Windows 定时休眠 睡眠 批处理命令
  20. 全基因组关联分析学习资料(GWAS tutorial)20210313更新版

热门文章

  1. 视频录制后怎么裁剪?这里有可以学习的操作
  2. matlab wik,MATLAB - Calculus
  3. 长江水利部门对河湖岸线保护力度空前加强
  4. Telink BLE 开发环境搭建
  5. Win7中文版转英文版
  6. 2018.4.3_面试记录_今日头条
  7. 3阶以内的矩阵求逆矩阵的3种手算方法
  8. acer计算机配置,宏碁笔记本如何配置电脑将视频从HDMI输出
  9. 【git】撤销远端合并到master分支
  10. Git怎样撤销一次分支的合并Merge