//类型转换

import UIKit

/*类型转换(Type Casting)

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

2.类型转换使用 is 和 as 操作符实现。用这两个操作符来检查值的类型或者转换它的类型,也可以用它来检查一个类型是否实现了某个协议

检查类型(Checking Type):用类型检查操作符"is"来检查一个实例是否属于特定类型,若实例属于那个类型,类型检查操作符返回 true,否则返回 false。

向下转型(Downcasting):

1.某类型的一个常量或变量可能在幕后实际上属于一个子类。当确定是这种情况时,你可以尝试向下转到它的子类型,用类型转换操作符(as? 或 as!)

2.因为向下转型可能会失败,类型转型操作符带有两种不同形式。条件形式(conditional form)as? 返回一个你试图向下转成的类型的可选值(optional value)。强制形式 as! 把试图向下转型和强制解包(force-unwraps)转换结果结合为一个操作。

3.当你不确定向下转型可以成功时,用类型转换的条件形式(as?),转型成功返回一个可选值,失败则返回nil

4.只有你可以确定向下转型一定会成功时,才使用强制形式(as!),转型为一个不正确的类型时,则触发运行时错误

Any 和 AnyObject 叫做不确定类型,

1.AnyObject可以表示任何类class类型的实例,可以用is和as来检查和转换它为更明确的类型

2.Any可以表示任何类型,包括函数类型,可以用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, artist: String) {

self.artist = artist

super.init(name: name)

}

}

//类型检测器能够推断出 Movie 和 Song 有共同的父类 MediaItem,所以它推断出library 的类型为 [MediaItem]

//在幕后 library 里存储的媒体项依然是 Movie 和 Song 类型的

let library = [

Movie(name: "Casablanca", director: "Michael Curtiz"),

Song(name: "Blue Suede Shoes", artist: "Elvis Presley"),

Movie(name: "Citizen Kane", director: "Orson Welles"),

Song(name: "The One And Only", artist: "Chesney Hawkes"),

Song(name: "Never Gonna Give You Up", artist: "Rick Astley")

]

var movieCount = 0

var songCount = 0

//=========== is 类型检查 ============

for item in library {

if item is Movie {

++movieCount

} else if item is Song {

++songCount

}

}

print("Media library contains \(movieCount) movies and \(songCount) songs")

// 打印 “Media library contains 2 movies and 3 songs”

//=============== 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)")

}

}

//===========AnyObject不确定的类类型==========

let someObjects: [AnyObject] = [

Movie(name: "2001: A Space Odyssey", director: "Stanley Kubrick"),

Movie(name: "Moon", director: "Duncan Jones"),

Movie(name: "Alien", director: "Ridley Scott")

]

for movie in someObjects as! [Movie] {

print("Movie: '\(movie.name)', dir. \(movie.director)")

}

//===========Any不确定类型,可为所有类型========

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)" })

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 positive double value of \(someDouble)")

case is Double:

print("some other double value 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 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("Michael"))

default:

print("something else")

}

}

swift学习笔记之-类型转换的更多相关文章

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

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

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

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

  3. swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  4. swift学习笔记1——基础部分

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  5. Swift学习笔记一

    最近计划把Swift语言系统学习一下,然后将MagViewer用这种新语言重构一次,并且优化一下,这里记录一下Swift的学习笔记. Swift和Objective-C相比,在语法和书写形式上做了很多 ...

  6. swift学习笔记4——扩展、协议

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  7. swift学习笔记3——类、结构体、枚举

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  8. swift学习笔记2——函数、闭包

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  9. 记录:swift学习笔记1-2

    swift还在不断的更新做细微的调整,都说早起的鸟儿有虫吃,那么我们早点出发吧,趁着国内绝大多数的coder们还没有开始大范围普遍应用. 网上有些大神说:swift很简单!我不同意这个观点,假如你用h ...

随机推荐

  1. 设置zookeeper jvm内存

    看了你的问题, 我还特意的查看了ZooKeeper的启动脚本代码.ZooKeeper启动脚本没有加任何参数,也就是使用jvm默认的. 如果想要加大ZooKeeper的JVM使用内存.可以在更改{ZK_ ...

  2. Oracle数据库入门——常用的数据字典

    一.oracle数据字典主要由以下几种视图构成:1.user视图以user_为前缀,用来记录用户对象的信息 2.all视图以all_为前缀,用来记录用户对象的信息及被授权访问的对象信息 3.dba视图 ...

  3. Android之输入框光标和Hint的位置

    如图所示,要实现这一的需求,一般人的布局方式就是左边一button,右边一button,中间一个EditText,为了输入框的响应触摸范围更大往往不会把宽度设置为wrap_content,要么设置成m ...

  4. Unix sed实用教程系列目录[已完成]

    本系列文章已经译完了,译自awk-sed@theunixschool,收获颇丰,作者没有讲明白的我做了补充,并且尝试讲的更清楚,整理成系列索引,方便学习,开篇非译文,是我为了方便后面的理解写的一篇,感 ...

  5. 又是一个小正则replace

    var a = "http://www.xx.com?id=111&-deb"; var b = "http://www.xx.com?-deb&id=1 ...

  6. iOS开发中一些常见的并行处理(转)

    本文主要探讨一些常用多任务的最佳实践.包括Core Data的多线程访问,UI的并行绘制,异步网络请求以及一些在运行态内存吃紧的情况下处理大文件的方案等.

其实编写异步处理的程序有很多坑!所以,本文 ...

  7. Java知多少(完结篇)

    Java知多少(1)语言概述 Java知多少(2)虚拟机(JVM)以及跨平台原理 Java知多少(3) 就业方向 Java知多少(4)J2SE.J2EE.J2ME的区别 Java知多少(5) Java ...

  8. Physical Based Shading in Unreal Engine 3

    Roughness = 0.1roughness = 0.4roughness = 0.7roughness = 0.999 以上的Fresnel 0° = {1.0,0.86.0.57}(PS: 近 ...

  9. DDD:如何表达聚合之间的关系?

    大家都能达成的两个共识是: 概念模型中,聚合之间充满着关系(双向). 对象模型中,根据有用性.性能和成本等因素考虑,保留某些必须的关系. 备注:读写分离有利于更好的表达关系,因为某些关系在读取的时候需 ...

  10. Android 布局之LinearLayout

    Android 布局之LinearLayout 1 LinearLayout简介 LinearLayout是线程布局.它包括2个方向(android:orientation):“水平”(horizon ...