下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】《从零开始学Swift》学习笔记(Day48)——类型检查与转换
原创文章,欢迎转载。转载请注明:关东升的博客
继承会发生在子类和父类之间,是一系列类的继承关系。例如:Person是类层次结构中的根类,Student是Person的直接子类,Worker是Person的直接子类。这个继承关系类的具体实现代码如下:class
Person
{
var
name:
String
var
age:
Int
func
description()
->
String
{
return
"\(name)
年龄是:
\(age)"
}
convenience
init
()
{
self.init(name:
"Tony")
self.age
=
18
}
convenience
init
(name:
String)
{
self.init(name:
name,
age:
18)
}
init
(name:
String,
age:
Int){
=
name
self.age
=
age
}
}
class
Student:
Person
{
var
school:
String
init
(name:
String,
age:
Int,school:
String)
{
self.school
=
school
super.init(name:
name,
age:
age)
}
}
class
Worker:
Person
{
var
factory:
String
init
(name:
String,
age:
Int,factory:
String)
{
self.factory
=
factory
super.init(name:
name,
age:
age)
}
}下面将以此为例,介绍Swift类的类型检查与转换,包括is操作符、as操作符。
使用is操作符is操作符可以判断一个实例是否是某个类的类型。如果实例是目标类型,结果返回true,否则为false。下面看一个示例:let
student1
=
Student(name:
"Tom",
age:
18,school:
"清华大学")//创建Student实例
let
student2
=
Student(name:
"Ben",
age:
28,school:
"北京大学")//创建Student实例
let
student3
=
Student(name:
"Tony",
age:
38,school:
"香港大学")//创建Student实例
let
worker1
=
Worker(name:
"Tom",
age:
18,factory:
"钢厂")//创建Worker实例
let
worker2
=
Worker(name:
"Ben",
age:
20,factory:
"电厂")//创建Worker实例
let
people
=
[student1,
student2,student3,
worker1,worker2]
//实例放入people数组集合中
var
studentCount
=
0
var
workerCount
=
0
for
item
in
people
{//使用for
in遍历people数组集合
if
item
is
Worker
{
++workerCount
}
else
if
item
is
Student
{
++studentCount
}
}
print("工人人数:\(workerCount)
,学生人数:\(studentCount)
。")我们可以在循环体中进行判断,itemisWorker表达式是判断集合中的元素是否是Worker类的实例。类似地,itemisStudent表达式是判断集合中的元素是否是Student类的实例。输出结果如下:工人人数:2,学生人数:3。
使用as操作符在介绍as操作符之前,先了解一下对象的类型转换,并不是所有的类型都能互相转换。下面先看如下语句:let
p1:
Person
=
Student(name:
"Tom",
age:
20,school:
"清华大学")
let
p2:
Person
=
Worker(name:
"Tom",
age:
18,factory:
"钢厂")
let
p3:
Person
=
Person(name:
"Tom",
age:
28)这里创建了3个实例p1、p2、p3,类型都是Person。p1是Student实例,p2是Worker实例,p3是Person实例。首先,对象类型转换一定发生在继承的前提下,p1和p2都声明为Person类型,而实例是由Person子类型实例化的。作为这段程序的编写者,我们知道p1本质上是Student实例,但是表面上看是Person类型,编译器也无法推断p1的实例是Person、Student还是Worker。我们可以使用is操作符来判断它是哪一类的实例。然后在转换时可以使用as操作符将其转换为子类类型,即把Person类型的p1转为Student子类类型,这种转换被称为向下转型。这种转换是有风险的,如果p1不是目标类型,转换就会失败。为了不发生异常,我们可以使用as?将其转换为目标类型的可选类型,能够成功则转换,不成功则返回nil。
p3与p1和p2有很大的不同,因为p3本质上是Person实例,不能向下转型。下面看一个示例:let
student1
=
Student(name:
"Tom",
age:
18,school:
"清华大学")
let
student2
=
Student(name:
"Ben",
age:
28,school:
"北京大学")
let
student3
=
Student(name:
"Tony",
age:
38,school:
"香港大学")
let
worker1
=
Worker(name:
"Tom",
age:
18,factory:
"钢厂")
let
worker2
=
Worker(name:
"Ben",
age:
20,factory:
"电厂")
let
people
=
[student1,
student2,student3,
worker1,worker2]
for
item
in
people
{
if
let
student
=
item
as?
Student
{
print("Student
school:\(Student.school)")
}
else
if
let
worker
=
item
as?
Worker
{
print("Worker
factory:\(Worker.factory)")
}
}使用forin遍历people数组集合。在循环体中,letstudent=itemas?Student语句使用as?操作符将元素转换为Student类型。如果转换成功,则把元素赋值给Student变量,否则将nil赋值给Student变量,转换成功执行代码。最后输出结果如下:Studentschool:清华大学Studentschool:北京大学Studentschool:香港大学Workerfactory:钢厂Workerfactory:电厂
as?操作符是在不确定是否类型转换能够成功情况下使用,如果成功转换结果是可选类型。如果我们能够确保转换一定成功,可以使用as!操作符在转换的同时进行隐式拆包。示例代码如下:...
let
people
=
[student1,
student2,student3,
worker1,worker2]
...
let
stud1
=
people[0]
as?Student
//people数组的第一个元素
print(stud1)
print(stud1!.name)
let
stud2
=
people[1]
as!Student
//people数组的第二个元素
print(stud2)
print()输出结果:Optional(Student)Student代码中people数组的第一个元素,使用as?操作符转换为Student类型,转换成功为Optional(Student),即
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《盾构机刀具》课件
- 统考版2025届高考数学全程一轮复习课时作业61随机事件的概率理
- 教师培训计划学校教师信息技术培训计划
- 公司2024季度工作计划模板
- 《牙源性肿瘤》课件
- 学前班下整整学期教学计划
- 六月小学班级安全工作计划
- 新学期幼儿园新教师培训计划
- 2024年新学期三年级班主任工作计划
- 2024年企业采购部工作计划汇编
- 施工现场安全巡检记录表-模板
- Part3-4 Unit5 Ancient Civilization教案-【中职专用】高一英语精研课堂(高教版2021·基础模块2)
- 江苏开放大学《汽车维修企业管理》终结性考试复习题库(附答案)
- 人力资源部人事科运用PDCA循环提升医院岗前培训的有效性
- 2023年广东省深圳市事业单位笔试参考题库(共500题)答案详解版
- 药疹护理的课件
- 心脏康复护理专家共识解读
- (IT项目管理)实验指导书
- 驾驶服务外包投标方案(完整版)
- 客房服务员国家标准
- 工业产品质量安全风险管控清单及日管控、周排查、月调度记录表
评论
0/150
提交评论