持续创作,加速生长!这是我参与「日新方案 6 月更文挑战」的第20天,点击查看活动概况。

在本章中,你将学会类型查看和类型转化的运用办法。

前语

Apple官网或者网上分享的教程类文章不同,我将以实践开发视点叙述Swift言语的一些概念和用法,便利大家更好地学习和掌握Swift言语。

这一起也是对自己学习Swift言语过程的知识整理。

如有过错,以你为准。

本章概述

Swift开发过程中,常常会遇到传输的类型和运用的类型不同的问题,不过好在Swift是强类型言语,咱们能够经过is、as?as!三种 操作符来对类型进行判别和强制转化。

咱们新建一个PlayGround项目,命名为SwiftTypeConversion

Swift实用小册17:类型检查和类型转换

准备工作

在之前的章节中,咱们学过父类与子类的关系及创立,这次咱们沿用那一章的案例进行说明。示例:

class AppInformation {
var appName: String
init(appName: String) {
self.appName = appName
}
}
class AppVersion: AppInformation {
var appVersion: String
init(appName: String, appVersion: String) {
self.appVersion = appVersion
super.init(appName: appName)
}
}
class AppAuthor: AppInformation {
var appAuthor: String
init(appName: String, appAuthor: String) {
self.appAuthor = appAuthor
super.init(appName: appName)
}
}

上述代码中,咱们创立了一个父类AppInformation,并初始化了一个String类型的变量appName

然后创立了两个子类:AppVersion、AppAuthorAppVersion子类中声明晰一个String类型的变量appVersionAppAuthor子类中声明晰一个String类型的变量appAuthor,咱们给两个类相应地初始化。

let App = [
AppVersion(appName: "我的第一个App", appVersion: "1.0.0"),
AppAuthor(appName: "我的第一个App", appAuthor: "文如秋雨")
]

上述代码中,咱们声明晰一个App常量数组,包含AppVersion子类和AppAuthor子类的实例。接下来,咱们就能够判别下咱们App数组的实例是在AppVersion子类里仍是在AppAuthor子类里。

Swift实用小册17:类型检查和类型转换

类型判别

当咱们接收到一个参数或者对象,需要判别某一个对象是否是某一个特定的类时,咱们能够运用is操作符判别接收到的数值是否归于这个类型。示例:

for AppTtem in App {
if AppTtem is AppVersion {
print("在AppVersion版别信息里")
} else if AppTtem is AppAuthor {
print("在AppAuthor作者信息里")
}
}

上述代码中,咱们经过for循环遍历App数组中的数据,假如App数组中的实例AppTtemAppVersion子类中,咱们打印输出文本信息,假如在AppAuthor子类中,咱们也打印输出。

经过is操作符,咱们就能够检测实例类型是否归于咱们特定的实例类型。

Swift实用小册17:类型检查和类型转换

类型转化

在实例类型转化,咱们会运用到了as?、 as!两种操作符,和try?、try!操作符概念相似,as?会用在当咱们不太确认是否能转化成功时的场景,而as!则代表了咱们简直一定会转化成功时的强制场景。

as!建议少用,有可能会因为强制转化失败而导致体系奔溃。

接受上面的比如,咱们提早是不知道App数组中是有哪些实例的,那么这儿咱们就能够运用as?操作符,来查看并向下转型。示例:

for AppTtem2 in App {
if let app1 = AppTtem2 as? AppVersion {
print("\(app1.appName)的版别是\(app1.appVersion)")
} else if let app2 = AppTtem2 as? AppAuthor {
print("\(app2.appName)的作者是\(app2.appAuthor)")
}
}

上述代码中,咱们运用as?操作符将AppTtem2类型向下转化类型为AppVersion类型,假如转化成功,则咱们声明的常量app1就能够存储AppVersion返回来的值。

值得注意的是:

as?操作符转化没有改变实例,只是简略地把它作为被转化成的类型来运用。

Swift实用小册17:类型检查和类型转换

其他类型转化

别的,咱们再来学习下两种类型的转化:AnyAnyObject的类型转化。

之前咱们学习数组的时分,数组会根据内部的值主动判别类型,这儿运用的Any类型,是代表这个数据能够是任何类型。示例:

var exampleArray = [Any]()
var exampleArray2 = [AnyObject]()

上述代码中,咱们声明晰一个变量数组exampleArray、exampleArray2,它们都是个能够存储任何类型值的空数组,咱们能够给这个数据新增任何类型的值。

两者的区别是Any能够表示任何类型,包括办法类型,AnyObject能够代表任何class类型的实例。

不过这两个根本没用过,咱们创立数组的时分仍是先界说好其类型,防止事务上处理报错。

本章代码

import UIKit
class AppInformation {
var appName: String
init(appName: String) {
self.appName = appName
}
}
class AppVersion: AppInformation {
var appVersion: String
init(appName: String, appVersion: String) {
self.appVersion = appVersion
super.init(appName: appName)
}
}
class AppAuthor: AppInformation {
var appAuthor: String
init(appName: String, appAuthor: String) {
self.appAuthor = appAuthor
super.init(appName: appName)
}
}
let App = [
AppVersion(appName: "我的第一个App", appVersion: "1.0.0"),
AppAuthor(appName: "我的第一个App", appAuthor: "文如秋雨")
]
for AppTtem in App {
if AppTtem is AppVersion {
print("在AppVersion版别信息里")
} else if AppTtem is AppAuthor {
print("在AppAuthor作者信息里")
}
}
for AppTtem2 in App {
if let app1 = AppTtem2 as? AppVersion {
print("\(app1.appName)的版别是\(app1.appVersion)")
} else if let app2 = AppTtem2 as? AppAuthor {
print("\(app2.appName)的作者是\(app2.appAuthor)")
}
}
var exampleArray = [Any]()
var exampleArray2 = [AnyObject]()

以上便是本章的全部内容。

快来动手试试吧!

假如本专栏对你有协助,不妨点赞、谈论、关注~