Swift 类型检查与类型转换
前言
- 在 Swift 语言中一般使用
is关键字实现类型检查,使用as关键字实现类型转换,除此之外还可以通过构造器和方法来实现类型转换。
1、类型检查
1.1 使用 is 检查
类型检查操作符
is可以用来检查一个实例是否属于特定子类型,若属于那个类型,则类型检查操作符返回true, 否则返回false。class Transport { var scope = "" init(scope: String) {
self.scope = scope
}
} class Car: Transport { var type = "daba" init(scope: String, type: String) {
super.init(scope: scope)
self.type = type
}
} class Airplance: Transport { var company = "dongfanghangkong" init(scope: String, company: String) {
super.init(scope: scope)
self.company = company
}
} var carNum = 0
var airNum = 0 let journey = [
Car(scope: "ludi", type: "daba"),
Car(scope: "ludi", type: "gongjiaoche"),
Airplance(scope: "hangkong", company: "dongfanghangkong"),
Car(scope: "ludi", type: "chuzuche")
]
for tra in journey { if tra is Car { // 检查是否属于 Car 类型
carNum += 1
} else if tra is Airplance { // 检查是否属于 Airplance 类型
airNum += 1
}
} print(carNum) // 3
print(airNum) // 1
1.2 使用 as? 检查
安全转型
as?,用于不确定是否可以转型成功的情况,如果转型成功则执行转型,如果转型行不通,就会返回nil,这时可以使用as?做类型检查。for tra in journey { if let _ = tra as? Car { // 检查是否属于 Car 类型
carNum += 1
} else if let _ = tra as? Airplance { // 检查是否属于 Airplance 类型
airNum += 1
}
} print(carNum) // 3
print(airNum) // 1
2、类型转换
2.1 使用 as 转换
有时候我们需要的某个类型的实例可能实际上是该类型的一个子类,可以使用关键字
as尝试对它使用向下转型得到它的子类。向下转型分为两种。
- 安全转型
as?,用于不确定是否可以转型成功的情况,如果转型成功则执行转型,如果转型行不通,就会返回nil,这时可以使用as?做类型检查。 - 强制转型
as!,只用在确定向下转型一定能够成功的情况下,当试图将实例向下转为一个不正确的类型时,会抛出异常。
- 安全转型
与
is关键字相比,使用as除了可以检查类型外,还可以访问子类的属性或者方法。通常为了使用转型成功的实例,搭配使用可选绑定。for tra in journey { if let car = tra as? Car { // 转换成 Car 类型
print(car.type)
} else if let airplane = tra as? Airplance { // 转换成 Airplance 类型
print(airplane.company)
}
}
2.2 使用 “构造器的方法” 转换
使用类型的构造器转换
let d: Double = 12.3
let i = Int(d) // 12
Swift 类型检查与类型转换的更多相关文章
- Swift类型检查与转换
继承会发生在子类和父类中,如图所示,是一系列类的继承关系类图,Person是类层次结构中的根类,Student是Person的直接子类,Worker是Person的直接子类.这个继承关系类图的具体实现 ...
- Swift—类型检查与转换-备
继承会发生在子类和父类之间,是一系列类的继承关系. 例如:Person是类层次结构中的根类,Student是Person的直接子类,Worker是Person的直接子类. 这个继承关系类的具体实现代码 ...
- Swift - 类型判断is 与 类型转换as
在Swift中,通常使用is和as操作符来实现类型检查和转换.下面通过样例来演示使用方法,首先定义几个类. 1 2 3 4 5 6 7 8 9 10 11 //基类,人类 class Human{ } ...
- 《从零开始学Swift》学习笔记(Day48)——类型检查与转换
原创文章,欢迎转载.转载请注明:关东升的博客 继承会发生在子类和父类之间,是一系列类的继承关系. 例如:Person是类层次结构中的根类,Student是Person的直接子类,Worker是Pers ...
- 《从零開始学Swift》学习笔记(Day48)——类型检查与转换
原创文章,欢迎转载.转载请注明:关东升的博客 继承会发生在子类和父类之间,是一系列类的继承关系. 比如:Person是类层次结构中的根类.Student是Person的直接子类.Worker是Pers ...
- 苹果新的编程语言 Swift 语言进阶(十三)--类型检查与类型嵌套
一 类型检查 1. 类型检查操作符 类型检查用来检查或转换一个实例的类型到另外的类型的一种方式. 在Swift中,类型检查使用is和as操作符来实现. is操作符用来检查一个实例是否是某种特定类型,如 ...
- swift 类型.
swift 类型 变量声明 用let来声明常量,用var来声明变量 可以在一行中声明多个常量或者多个变量,用逗号隔开 var x = 0.0, y = 0.0, z = 0.0 类型安全 Swift ...
- 编译器开发系列--Ocelot语言6.静态类型检查
关于"静态类型检查",想必使用C 或Java 的各位应该非常熟悉了.在此过程中将检查表达式的类型,发现类型不正确的操作时就会报错.例如结构体之间无法用+ 进行加法运算,指针和数值之 ...
- Java中静态类型检查是如何进行的
以下内容来自维基百科,关于静态类型检查和动态类型检查的解释: 静态类型检查:基于程序的源代码来验证类型安全的过程: 动态类型检查:在程序运行期间验证类型安全的过程: Java使用静态类型检查在编译期间 ...
随机推荐
- Mac 隐私与安全没有允许任何来源选项
mac 允许任何来源的 app 在 macOS Sierra 10.12 及之后的版本,都没有 打开任何来源 的选项,解决方法: 终端执行命令: sudo spctl --master-disable
- ecshop二次开发 使用ecshop电子商务系统的100个小问题
自己从事B4C电子商务开发一段时间了,特别对ecshop深有体会,刚接触的时候不容易理解,下面将根据自己的经验,来总结100条关于操作ecshop电子商务系统的小问题. 1:如何修改网站"欢 ...
- PAT《数据结构学习与实验指导》实验项目集 2-09 2-10 2-11 2-12 2-13
pat 2-09 装箱问题模拟 #include<cstdio> #include<set> #include<vector> using namespace st ...
- 014-Go Web 对pg增删改查测试
1:data/data.go package data import( "fmt" "database/sql" _"github.com/lib/p ...
- Layer文件上传操作
1:upload.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...
- 使用sphinx自动提取python中的注释成为接口文档
写好了代码,交付给他人使用的时候,查看代码固然可以了解各类和函数的功能细节,但接口文档能更方便的查找和说明功能.所以,一价与代码同步的接口文档是很有必要的.sphinx可以根据python中的注释,自 ...
- infobright系列二:数据迁移
安装之后把之前infobright的数据迁移到新安装的infobright上. 1:挺掉相关的服务 2:scp 把旧数据拷到新安装的infobright上 3:修改/etc/my-ib.cnf的数据目 ...
- 解决 ERROR in native method: JDWP No transports initialized, jvmtiError=AGENT_ERROR_TRANSPORT_INIT(197)
在/etc/hosts文件中加入下面一行内容 127.0.0.1 localhost.localdomain localhost
- 利用sqlserver sa更改系统密码
--允许修改高级属性 sp_configure go reconfigure go --启用扩展存储命令 sp_configure go reconfigure go --系统添加一个windows用 ...
- ACE .i .inl文件(转)
在ACE的源代码目录里,有源文件.cpp.头文件.h,我们还发现有以.i和.inl为扩展名的文件.其实,以.i和.inl为扩展名的文件是ACE源码中inline函数的存放形式. 在说明ACE中为什么采 ...