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

// 类型转换在 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. MongoDB 优点

    任何关系型数据库,具有典型的架构设计,显示表和这些表之间的关系.虽然在 MongoDB中,没有什么关系的概念. MongoDB比RDBMS的优势 架构:MongoDB是文档型数据库,其中一个集合保存不 ...

  2. bash脚本编程之二 字符串测试及for循环

    shell中大量的测试和比较选项而困惑呢? 这个技巧可以帮助您解密不同类型的文件.算术和字符串测试,这样您就能够知道什么时候使用 test. [ ]. [[ ]].(( )) 或 if-then-el ...

  3. Env:zsh和fish安装和使用

    zsh优势兼容bash, 方便git管理,但是有时候切换速度较慢,特别遇到git仓库目录 fish优势速度较快,路径提示也不错,但是和bash不兼容 1. zsh 首先,可以通过cat /etc/sh ...

  4. Practice 15.07.07 计算几何 - 1

    [题目在这里] A.POJ 2318 叉积判断点在直线的那一侧 cross(X2-X1,P-X1)  (x1,x2是直线上两点,p是要判断的点) >0 表示在左侧 <0 表示在右侧 (右手 ...

  5. HDOJ(HDU) 2088 Box of Bricks(平均值)

    Problem Description Little Bob likes playing with his box of bricks. He puts the bricks one upon ano ...

  6. 导出DBF,并且提供下载 .

    原文:导出DBF,并且提供下载 . 导出DBF,并且提供下载 #region Declare string mFilePath = MapPath("../DataTmp/");  ...

  7. iOS初学,关于变量加下划线问题

    为什么做ios开发,变量前要加下划线才有用? 看到这个哥们的解释后,终于明白了,转帖到此. 链接在此:http://www.cocoachina.com/bbs/read.php?tid=234290 ...

  8. 简述angular自定义过滤器在页面和控制器中的使用

    首先设置自定义过滤器. 定义模块名:angular ? 1 2 3 4 5 6 .module('myApp') .filter('filterName',function(){ return fun ...

  9. 如何给pdf文件中的一页添加水印

    如题所述,项目需求.要把一份文件尾部加上签章,首先想到的就是水印. 开始试过了无论是word还是wps所谓的水印其实就是页脚或页眉统一格式,无法单一一个页面操作,要加所有的页面都有. 纵然wps有个功 ...

  10. Flex-box入门---flex-grow, flex-shrink, flex-basis

    Block Elements and inline elements(块元素和行内元素) 在进入正题之前,我们先来简单总结一下传统的block元素和inline元素. HTML中的block元素显示在 ...