一 类型检查

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()


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

  1. 苹果新的编程语言 Swift 语言进阶(十六)--泛型

    泛型允许你定义一个宽松.可重用的函数或者类型,使用泛型能够避免代码的重复,也能以更清楚和抽象的方式来表达程序的意图. 泛型是Swift语言提供的强大功能之一,Swift提供的许多标准库都使用了泛型来创 ...

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

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

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

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

  4. 苹果新的编程语言 Swift 语言进阶(十五)--协议

    协议定义了适合某个特定任务或功能需要的方法.属性和其它需求的一个蓝图.协议本身不提供这些需求的实现,它只是描述了一个任务或功能实现的蓝图. 协议与java 语言中的接口定义类似,都是描述了一个实现可以 ...

  5. 苹果新的编程语言 Swift 语言进阶(十四)--扩展

    扩展是为一个已经存在的类.结构.枚举类型添加新功能的一种方式,包括为不能存取源代码的那些已经存在的类型添加功能. 扩展类似于Objective-C语言中的类别,与类别不同的是Swift语言的扩展没有名 ...

  6. 苹果新的编程语言 Swift 语言进阶(九)--方法和下标

    一.方法 方法是与特定类型相关的函数.与属性一样,方法也包括实例方法和类型方法. 类.结构.枚举都能定义实例方法,用来封装或实现给定类型的一个实例相关的功能或特定任务. 类.结构.枚举也能定义与类型本 ...

  7. 苹果新的编程语言 Swift 语言进阶(七)--枚举、结构、类

    Swift语言中,具有类特征的类型包括三种,即枚举类型.结构类型(包括基本类型,基本类型实际都是结构类型的特例).类.其中枚举类型.结构类型是属于值类型,类属于引用类型.三种类型都可以添加属性.方法. ...

  8. 苹果新的编程语言 Swift 语言进阶(四)--字符串和收集类型

    一.字符串( String  )和字符类型(Character) 字符串是一种字符的带次序的收集类型(相当于数组),字符是字符串中的元素. 在Swift 语言中,字符串是编码独立的Unicode字符的 ...

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

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

随机推荐

  1. activiti实战系列 并行网关(parallelGateWay)

    流程图 13.2:部署流程定义+启动流程实例 13.3:查询我的个人任务 13.4:完成我的个人任务 说明: 1) 一个流程中流程实例只有1个,执行对象有多个 2)  并行网关的功能是基于进入和外出的 ...

  2. 微信小程序基础之新建的项目文件图解

    昨天发布的文章,感觉对于学习不够直观,所以今天重点在图标上进行了详细的对应介绍,稍后会尝试开发小程序控件的使用.转载请标注出处,谢谢!

  3. JAVA面向对象-----抽象类

    1抽象类 为什么使用抽象类 1:定义Dog类 有颜色属性和叫的方法 2:定义Bird类 有颜色属性和叫的方法 3:定义其父类Animal 1:颜色的属性可以使用默认初始化值. 2:叫的方法在父类中如何 ...

  4. Android简易实战教程--第十九话《手把手教您监听EditText文本变化,实现抖动和震动的效果》

    昨晚写博客太仓促,代码结构有问题,早上测试发现没法监听文本变化!今日更改一下.真心见谅啦,哈哈!主活动的代码已经改好了,看截图这次的确实现了文本监听变化情况. 监听文本输入情况,仅仅限于土司略显low ...

  5. Java遍历时删除List、Set、Map中的元素(源码分析)

    在对List.Set.Map执行遍历删除或添加等改变集合个数的操作时,不能使用普通的while.for循环或增强for.会抛出ConcurrentModificationException异常或者没有 ...

  6. Activity和Window的View的移动的一些思考与体会,腾讯悬浮小火箭的实现策略

    Activity和Window的View的移动的一些思考与体会,腾讯悬浮小火箭的实现策略 事实上写这个也是因为自己实际在项目中用到了才会去研究已经写文章,对于View的移动,其实说实话,已经有很多文章 ...

  7. Java基础---Java---网络编程---TCP的传输、客户端和服务端的互访、建立一个文本转换器、编写一个聊天程序

    演示TCP的传输的客户端和服务端的互访 需求:客户端给服务端发送数据,服务端收到后,给客户端反馈信息. 客户端: 1.建立Socket服务,指定要连接方朵和端口 2.获取Socket流中的输出流,将数 ...

  8. octave installation on RHEL6.4

    octave installation on RHEL6.4 rhel6.4上安装octave GNU Octave 是一种高级语言,主要设计用来进行数值计算,它是 MathWorks 出品的 Mat ...

  9. 06 intent flag三种属性

    flag属性可以看做和写在清单文件中的启动模式一样 但效果有一定差别 1,FLAG_ACTIVITY_SINGLE_TOP:启动模式里的SingleTop一致  如果X启动模式设置为FLAG_ACTI ...

  10. hashmap简单实例(个人使用经验)

    一.HashMap<int,String>是错误的:因为int是基本类型,而key和value要求是对象,所以要用Integer而不是int.HashMap<String,Objec ...