swift 学习- 21 -- 类型转换
// 类型转换 可以判断实例的类型, 也可以将实例看做其父类的或者子类的实例
// 类型转换在 Swift 中使用 is 和 as 操作符实现, 这两个操作符提供了一种简单达意的方式去检查值的类型 或者转换它的类型
// 你也可以用它来检查一个类型是否实现了某个协议
// 定义一个类层次作为例子
// 你可以将类型转换用在类和子类的层次结构上, 检查特定类实例的类型并且转换这个类实例成为这个层次结构中的其他类型
class MediaItem{
var name: String
init(name: String) {
self.name = name
}
}
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, aritist: String) {
self.artist = aritist
super.init(name: name)
}
}
let library = [
Movie.init(name: "Casablanca", director: "Michael Curtiz"),
Song.init(name: "Blue Suede Shoes", aritist: "Elvis Presley"),
Movie.init(name: "Citizen Kane", director: "Orson Welles"),
Song.init(name: "The One And Only", aritist: "Chesney Hawkes"),
Song.init(name: "Never Gonna Give You Up", aritist: "Rick Astley")
]
// 类型检查
// 用类型检查符 ( is ) 来检查一个实例是否属于特定子类型, 若实例属于那个子实例, 类型检查操作符返回 true, 否则返回 false
var movieCount = 0
var songCount = 0
for item in library {
if item is Movie {
movieCount += 1
}else if item is Song{
songCount += 1
}
}
print("Media library contains \(movieCount) movies and \(songCount) songs")
// 向下转型
// 某类型的一个常量 或 变量可能在幕后属于一个子类, 当确定是这种情况时, 你可以尝试向下转到它的子类型, 用类型转换 操作符 (as? 或 as)
// 因为向下转型 可能会失败 ,类型转换操作符带有两个不同的形式, 条件形式 as?, 返回一个你试图向下转成的类型的可选值, 强制形式 as!, 把试图向下转型和强制解包 (转换结果结合为一个操作)
// 当不确定向下转型可以成功时. 用类型转换的条件形式 (as?), 这使得能够检查向下转型是否成功
// 只有你可以确定向下转型一定会成功时, 才会使用强制形式 (as!), 当你试图转换一个不正确的类型时, 会触发一个运行时错误
for item in library {
if let movie = item as? Movie {
print("Movie: \(movie.name), dir.\(movie.director)")
}else if let song = item as? Song{
print("Song: \(song.name), by \(song.artist)")
}
}
// 转换没有真的改变实例它的值, 根本的实例保持不变, 只是简单的把它作为它被转换成的类型来使用
// Any 和 AnyObject 的类型转换
// Swift为不确定的类型提供了两个特殊的了类型别名
// Any 可以表示 任何类型, 包括函数类型
// AnyObject 可以表示任何 类类型 的实例
// 只有当你确实需要它们的行为和功能是才使用 Any 和 AnyObject
var things = [Any]()
things.append(0)
things.append(0.0)
things.append(42)
things.append(3.14159)
things.append("hello")
things.append((3.0, 5.0))
things.append(Movie(name: "Ghostbusters", director: "Ivan Reitman"))
things.append({ (name: String) -> String in "Hello, \(name)" })
// 注意 : Any 类型可以表示所有类型的值, 包括可选类型, Swift 会在你用 Any 类型来表示一个可选值的时候, 给你一个警告, 如果你确实想使用 Any 类型来承载可选值, 你可以使用 as 操作符显式转换为 Any
let optionalNumber: Int? = 3
things.append(optionalNumber) // 警告
things.append(optionalNumber as Any) // 没有警告
swift 学习- 21 -- 类型转换的更多相关文章
- Swift学习目录
本学习基于苹果官方Swift学习材料,保留了原版90%左右的内容(一些项目开发中基本不用的知识点没有整理),并根据理解进行整理.如对原版感兴趣,可以直接单击链接阅读和学习. 第一部分 基础篇 1.基本 ...
- 【swift学习笔记】二.页面转跳数据回传
上一篇我们介绍了页面转跳:[swift学习笔记]一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据加上了"回传"两个字 ...
- 今天开始Swift学习
今天开始Swift学习 在此记录笔记 以备之后查阅! allenhuang
- iOS ---Swift学习与复习
swift中文网 http://www.swiftv.cn http://swifter.tips/ http://objccn.io/ http://www.swiftmi.com/code4swi ...
- 12套swift学习资源分享
虽然objective-c编程语言在过去很长一段时间都是iOS应用开发的基础语言,且很多iOS开发者对其也深爱有佳,但是随着swift编程语言的问世,迅速发展为开发者追捧的语言.且今年伴随着swift ...
- Swift学习之常用UI的使用
Swift学习之常用UI的使用 最近笔者在开始学习苹果最新的编程语言,因为笔者认为,苹果既然出了这门语言就绝对不会放弃,除非苹果倒闭了(当然这里知识一个玩笑). 所以在不久的将来,swift绝对是iO ...
- [转]swift 学习资源 大集合
今天看到了一个swift的学习网站,里面收集了很多学习资源 [转自http://blog.csdn.net/sqc3375177/article/details/29206779] Swift 介绍 ...
- swift 学习资源 大集合
今天看到一个swift学习网站,其中我们收集了大量的学习资源 Swift 介绍 Swift 介绍 来自 Apple 官方 Swift 简单介绍 (@peng_gong) 一篇不错的中文简单介绍 [译] ...
- Swift学习笔记(一)搭配环境以及代码运行成功
原文:Swift学习笔记(一)搭配环境以及代码运行成功 1.Swift是啥? 百度去!度娘告诉你它是苹果最新推出的编程语言,比c,c++,objc要高效简单.能够开发ios,mac相关的app哦!是苹 ...
随机推荐
- Javaweb学习笔记——(十四)—————— 服务器端验证注册登入表单项目
项目:https://download.csdn.net/download/qq_40223688/10463436 项目 功能: *注册 *登录--------------------------- ...
- [译]Managing Vue.js State with Vuex
原文 准备 安装 Vuex, 是Vue官方出的package, 它不是Vue内置的.需要另外安装. npm install vuex --save 然后,需要在应用启动文件启用Vuex. main.j ...
- 剑指offer: 数组中的逆序对
1. 最简单的思路,对每个值,遍历与其逆序的数组对:但时间复杂度太高: 2. 归并排序的思路: 先将数组分隔成子数组,先统计出子数组内的逆序对的数目,然后统计两个相邻子数组之间的逆序对的数目: int ...
- Python之进程 3 - 进程池和multiprocess.Poll
一.为什么要有进程池? 在程序实际处理问题过程中,忙时会有成千上万的任务需要被执行,闲时可能只有零星任务.那么在成千上万个任务需要被执行的时候,我们就需要去创建成千上万个进程么?首先,创建进程需要消耗 ...
- luogu P5112 FZOUTSY
传送门 毒瘤出题人,卡我常数 如果后缀排序后将两两之间height\(\ge k\)的后缀放在一组,那么每次询问的答案就是\(\sum_{i} \binom{num[i]}{2}\)(num[i]是第 ...
- ubuntu 18.04/18.10解决create-react-app:command not found问题
npm config set prefix /usr/local sudo npm install -g create-react-app create-react-app my-app
- 剑指Offer题解索引
数组 数组中重复的数字 二维数组中的查找 构建乘积数组 字符串 替换空格 字符流中第一个不重复的字符 表示数值的字符串 递归和循环 斐波那契数列 跳台阶 变态跳台阶 矩形覆盖 链表 从尾到头打印链表 ...
- linux scanf函数%d后加空白
参考链接: https://bbs.csdn.net/topics/390389059 关键点: scanf()中空白字符(包括/n,space)会使scanf()函数在读操作中略去输入中的零个或者一 ...
- Object的wait/notify/notifyAll&&Thread的sleep/yield/join/holdsLock
一.wait/notify/notifyAll都是Object类的实例方法 1.wait方法:阻塞当前线程等待notify/notifyAll方法的唤醒,或等待超时后自动唤醒. wait等待其实是对象 ...
- ASP.NET MVC - XML节点查找
Jquery操作Xml Jquery1.2开始不再支持XPath表达式. <?xml version="1.0" encoding="utf-8" ?&g ...