// 类型转换 可以判断实例的类型, 也可以将实例看做其父类的或者子类的实例

// 类型转换在 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 -- 类型转换的更多相关文章

  1. Swift学习目录

    本学习基于苹果官方Swift学习材料,保留了原版90%左右的内容(一些项目开发中基本不用的知识点没有整理),并根据理解进行整理.如对原版感兴趣,可以直接单击链接阅读和学习. 第一部分 基础篇 1.基本 ...

  2. 【swift学习笔记】二.页面转跳数据回传

    上一篇我们介绍了页面转跳:[swift学习笔记]一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据加上了"回传"两个字 ...

  3. 今天开始Swift学习

    今天开始Swift学习  在此记录笔记  以备之后查阅! allenhuang

  4. iOS ---Swift学习与复习

    swift中文网 http://www.swiftv.cn http://swifter.tips/ http://objccn.io/ http://www.swiftmi.com/code4swi ...

  5. 12套swift学习资源分享

    虽然objective-c编程语言在过去很长一段时间都是iOS应用开发的基础语言,且很多iOS开发者对其也深爱有佳,但是随着swift编程语言的问世,迅速发展为开发者追捧的语言.且今年伴随着swift ...

  6. Swift学习之常用UI的使用

    Swift学习之常用UI的使用 最近笔者在开始学习苹果最新的编程语言,因为笔者认为,苹果既然出了这门语言就绝对不会放弃,除非苹果倒闭了(当然这里知识一个玩笑). 所以在不久的将来,swift绝对是iO ...

  7. [转]swift 学习资源 大集合

    今天看到了一个swift的学习网站,里面收集了很多学习资源 [转自http://blog.csdn.net/sqc3375177/article/details/29206779] Swift 介绍 ...

  8. swift 学习资源 大集合

    今天看到一个swift学习网站,其中我们收集了大量的学习资源 Swift 介绍 Swift 介绍 来自 Apple 官方 Swift 简单介绍 (@peng_gong) 一篇不错的中文简单介绍 [译] ...

  9. Swift学习笔记(一)搭配环境以及代码运行成功

    原文:Swift学习笔记(一)搭配环境以及代码运行成功 1.Swift是啥? 百度去!度娘告诉你它是苹果最新推出的编程语言,比c,c++,objc要高效简单.能够开发ios,mac相关的app哦!是苹 ...

随机推荐

  1. Spring Data 起步

    [Maven 坐标]G A V ……………………………………………………………………………………………………………………………………………… [JDBC] Connection 连接数据库 State ...

  2. NEX 事件

    我正在上班突然看到这个事情差点没笑抽. 转自纯洁的微笑:原文在此:http://www.cnblogs.com/ityouknow/p/9247842.html#4010697 大家知道 VIVO 上 ...

  3. sockaddr_in 与 in_addr的区别

    struct sockaddr_in {short int sin_family; /* 地址族 */unsigned short int sin_port; /* 端口号 */struct in_a ...

  4. python - 代码练习 - 差异备份/同步更新

    差异备份以及文件同步: import os import filecmp import shutil import re # 差异增量更新,dir2 文件目录 与 dir1 文件目录更新, def a ...

  5. UVA315 Network 连通图割点

    题目大意:有向图求割点 题目思路: 一个点u为割点时当且仅当满足两个两个条件之一: 1.该点为根节点且至少有两个子节点 2.u不为树根,且满足存在(u,v)为树枝边(或称 父子边,即u为v在搜索树中的 ...

  6. css3基础一

    1,css简介 CSS 用于控制网页的样式和布局.样式定义如何显示html元素,样式通常保存在外部的 .css 文件中.通过仅仅编辑一个简单的 CSS 文档,外部样式表使你有能力同时改变站点中所有页面 ...

  7. 20165231 预习作业3 linux安装及学习

    linux安装 由于以前稍微关注过虚拟机相关知识,所以大致知道虚拟机软件的相关知识.目前我已知的普遍使用的虚拟机软件是VMware Workstation(下文简称VM),VirtualBox(下文简 ...

  8. Linux电源管理(7)_Wakeup events framework【转】

    转自:http://www.wowotech.net/pm_subsystem/wakeup_events_framework.html 1.  前言 本文继续“Linux电源管理(6)_Generi ...

  9. Apollo-3.0本地编译

    Apollo-3.0本地编译 用docker编译所用的dev.x86_64.dockerfile文件(具体位置在apollo/docker/build)中有所有的依赖库或包, 还会执行一些shell脚 ...

  10. ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)

    背景 老生常谈,为sql当时着迷了,啥都用sql解决.看这个语句,麻烦的. ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN) 简单的说row ...