一 类型检查

1、 类型检查操作符

类型检查用来检查或转换一个实例的类型到另外的类型的一种方式。

在Swift中,类型检查使用is和as操作符来实现。

is操作符用来检查一个实例是否是某种特定类型,如果是返回true,否则返回false。

as操作符用来把某个实例转型为另外的类型,由于实例转型可能失败,因此Swift为as操作符提供了两种形式:选项形式as?和强制形式as。

选项形式(as?)的操作执行转换并返回期望类型的一个选项值,如果转换成功则返回的选项包含有效值,否则选项值为 nil

强制形式(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)

}

}

let library = [

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

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

Astley")

]

var movieCount =0

var songCount =0

for item in library {

if item is Movie {

++movieCount

}else if item is Song {

++songCount

}

}

for item in library {

if let movie =item as? Movie {

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

}else if let song =item as? Song {

println("Song: '\(song.name)', by \(song.artist)")

}

}

本例首先定义了一个媒体类的继承树,其中两个类Movie和Song都继承自其基类MediaItem,接着定义一个包含这两个媒体项实例的数组library,然后在for in循环中使用is操作符来检查某个媒体项是否是特定类型的实例,使用as操作符的选项形式as?来转换媒体项的实例为特定类型的实例。

2、 任意类型的使用

Swift提供了两个特定的类型别名:AnyObject与Any。

AnyObject类型能代表任何类类型。

Any类型能代表任意除了函数类型之外的所有其它类型。

例子展示了如何使用AnyObject类型定义一个AnyObject类型的数组以及该数组的使用,AnyObject类型的数组成员可以是任意的类的实例,例子中为Movie类的实例。

let someObjects:AnyObject[] = [

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

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

]

for object in someObjects {

let movie =object as Movie

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

}

//以上循环使用as操作符强制转换一个类型为AnyObject的实例为确定的类型Movie类的实例,因此可能出现运行时错误。

//也可以直接使用as 操作符直接把someObjects类型的数组转型为Movie类型的数组,如下:

for movie in someObjects as Movie[] {

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

}

如下例子展示Any的使用,可以使用Any来代替任何类型。

var things =Any[]()

things.append(0)

things.append(0.0)

things.append("hello")

things.append((3.0,5.0))

things.append(Movie(name:"Ghostbusters",director:"Ivan Reitman"))

Any类型的数组可以包含任意类型的实例,如本例Any类型的数组things包含一个整数、浮点数、字符串、多元组、类的实例。

二  类型嵌套

类型嵌套允许你在一种类型中嵌套定义另外一种类型。在另外类型中定义的类型称为嵌套类型,嵌套类型定义在它的支持类型内部。类型能够多级嵌套,嵌套类型内部可以再嵌套定义另外的类型,如下例子所示:

struct BlackjackCard {

// nested Rank enumeration

enum Rank:Int {

case Jack, Queen, King, Ace

// nested Values struct

struct Values {

let first:Int,second:Int?

}

}

}

使用点语法来存取一个嵌套类型的属性、方法、或下标。

从嵌套类型的最外一级类型开始,一级级地向内获得要查询的嵌套类型的属性、方法、或下标。

如下所示:

let jackSymbol =BlackjackCard.Rank.Jack.toRaw()

转载于:https://www.cnblogs.com/aiwz/p/6154477.html

苹果新的编程语言 Swift 语言进阶(十三)--类型检查与类型嵌套相关推荐

  1. 苹果新的编程语言 Swift 语言进阶(一)--综述

    Swift 是苹果开发和提供的供开发IOS 和OS X应用的一门新的语言.Swift语言基于C 和Objective-C语言,除了提供C 和Objective-C语言具有的所有语法功能外,为了编程方便 ...

  2. 苹果新的编程语言 Swift 语言进阶(三)--基本运算和扩展运算

    一 基本操作运算 1. 赋值操作 在Swift 中,能够使用赋值操作为一个常量或一个变量赋值,也能够使用多元组一次为多个常量或变量赋值. Swift 的赋值操作与其他语言最大的不同是赋值操作除了可以为 ...

  3. 苹果新的编程语言 Swift 语言进阶(二)--基本数据类型

    一  .   常量和变量 Swift语言 对常量和变量的声明进行了明白的区分 Swift语言的常量类型比C 语言的constants类型更加强大,语义更加明白. 常量和变量的差别是常量在设置或初始化后 ...

  4. A Swift Tour, 苹果新推出的开发语言

    苹果近日召开了全球开发者大会(WWDC),推出了一种新的开发语言 Swift,有人说是用来替代Objective-C的,以下是苹果官方文档,第一时间整理了一下,觉得还是很有前景的,有些英文看不懂的就直 ...

  5. 苹果公司的新的编程语言 Swift 高级语言()两--基本数据类型

    一  .   常量和变量 Swift语言 对常量和变量的声明进行了明白的区分 Swift语言的常量类型比C 语言的constants类型更加强大,语义更加明白. 常量和变量的差别是常量在设置或初始化后 ...

  6. playgrounds能运行c语言吗,儿童学编程语言 swift语言playgrounds第一课

    swift playgrounds 编程界面 但是包括scratch在内的其他多数的儿童学习软件,基本都没有接触到代码层面,主要还是学习的是编程思维,转而学习真正的编程语言比如python时,还是要从 ...

  7. 初探swift语言的学习笔记二(可选类型?和隐式可选类型!)

    作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/28904115 转载请注明出处 如果觉得文章对你有所帮助,请通过留言 ...

  8. 苹果编程语言Swift解析:将推动应用开发巨变

     苹果编程语言Swift解析:将推动应用开发巨变     以下为文章全文: 许多人可能都已忘记苹果WWDC中的"D"代表了"开发者".这是一次开发者的大会, ...

  9. Lyft押重注于苹果编程语言Swift

    Lyft押重注于苹果编程语言Swift 1年后获得丰厚回报BI中文站 8月22日报道 一年多以前,打车应用Lyft做出重大决定,决心押重注于苹果开发的编程语言Swift,用这种编程语言重写其所有iPh ...

最新文章

  1. QTP的那些事--通过WMI获取session中的用户信息的验证码
  2. 虚拟机红帽linux登陆密码,[操作系统]vmware虚拟机安装了linux(redhat)系统忘记登录密码怎么办...
  3. Mysql:mysql 控制台程序的提示符 prompt 字符串设置
  4. Linux753权限,linux的chmod与chown命令详解
  5. 全选反选JavaScript实现
  6. linux的基础知识——全局变量异步I/O
  7. css 元素类型 行内元素 块元素 内联块元素 0302
  8. yyb要填的各种总结的坑
  9. JAVA 垃圾收集监控
  10. 微信小程序期末大作业,飞机大战
  11. VSTO打包加载项 WPS可用 Advanced Installer
  12. 关于unity3d多点触控的研究
  13. Q4营收突破20亿且连续四个季度盈利斗鱼驶入“后直播时代”快车道
  14. 胸怀——勇气——智慧
  15. ABP官方文档(四十四)【后台作业和后台工人】
  16. python用户名和密码登录_Python爬虫带用户名密码登录
  17. css针对IE单独设置样式
  18. selenium安装、pip升级、更换国内源
  19. 安装windows和android双系统,小雷问答丨普通电脑怎么装 Windows 和安卓的双系统?...
  20. 27.4.1 开发ActiveX控件

热门文章

  1. 如何设置网站标题更有利于网站SEO优化?
  2. u盘文件看得见却打不开_win7下u盘文件打不开怎么办 win7下u盘文件打不开解决方法...
  3. mysql同步 触发器_mysql 触发器(数据库的同步)
  4. 黑龙江科技大学计算机是几本,黑龙江科技大学是几本
  5. android okhttp 多线程,android – Okhttp Authenticator多线程
  6. RecyclerView Adapter 所使用的数据list发生变化需要注意的事情
  7. 数据不够怎么训练深度学习模型?不妨试试迁移学习 ——重用神经网络的结构2...
  8. Faas 典型场景——应用负载有显著的波峰波谷,典型用例-基于事件的数据处理...
  9. HDU 6015 Colorful Tree(2017多校)
  10. CentOS7下查询硬件信息