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

简介: 在本章中,你将学会类型检查和类型转换的使用方法。

image.png

前言


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

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

如有错误,以你为准。

本章概述


Swift开发过程中,常常会遇到传输的类型和使用的类型不同的问题,不过好在Swift是强类型语言,我们可以通过is、as?as!三种 操作符来对类型进行判断和强制转换。

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

image.png

准备工作


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

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子类里。

image.png

类型判断


当我们接收到一个参数或者对象,需要判断某一个对象是否是某一个特定的类时,我们可以使用is操作符判断接收到的数值是否属于这个类型。示例:

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

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

通过is操作符,我们就可以检测实例类型是否属于我们特定的实例类型。

image.png

类型转换


在实例类型转换,我们会使用到了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?操作符转换没有改变实例,只是简单地把它作为被转换成的类型来使用。

image.png

其他类型转换

另外,我们再来学习下两种类型的转换: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]()

以上就是本章的全部内容。快来动手试试吧!

相关文章
|
6月前
|
存储 Swift iOS开发
在Swift编程语言中,集合类型`Set`
在Swift编程语言中,集合类型`Set`
57 2
|
14天前
|
Swift 索引 容器
Swift 泛型-扩展泛型类型
Swift 泛型-扩展泛型类型
22 2
|
14天前
|
Swift 索引
Swift 泛型-类型约束
Swift 泛型-类型约束
23 1
|
23天前
|
安全 Swift iOS开发
Swift 可选(Optionals)类型
10月更文挑战第24天
35 2
|
6月前
|
存储 安全 Swift
【Swift开发专栏】Swift中的集合类型:数组、字典与集合
【4月更文挑战第30天】本文探讨Swift的三种内置集合类型:数组、字典和集合。数组是有序元素集合,支持动态大小调整和类型安全;字典是无序键值对,适用于快速查找;集合是无序不重复元素集合,适合检查元素存在性和集合运算。理解这些特性和用法能提升Swift编程效率。
69 1
|
6月前
|
安全 Swift
【Swift开发专栏】Swift中的可选类型与解包
【4月更文挑战第30天】Swift的可选类型(Optional)用于表示变量可能无值,如用户未填写表单或空服务器数据。可选类型用问号(?)标记,状态可为包含值或nil。解包包括强制解包(!,可能触发运行时错误)、可选绑定(在if/while中安全解包)和隐式解包(声明时带!,使用时不需显式解包)。高级用法包括可选链式调用、空合并操作符(??)和可选类型比较。理解并恰当使用这些概念能提升代码的健壮性和安全性。
68 1
|
6月前
|
安全 Swift
Swift 语言:什么是可选类型(Optional)?如何处理可选类型的安全解包?
Swift的可选类型是处理值可能缺失的类,用?表示。它们能表示有值或无值状态。安全解包用`if let`或`guard let`避免崩溃,而强制解包`!`则风险较高,若值为`nil`会触发运行时错误。
48 0
|
6月前
|
存储 Swift 索引
在 Swift 编程语言中,集合类型 `Set`
在 Swift 编程语言中,集合类型 `Set`
65 1
|
6月前
|
Swift
在Swift编程语言中,有符号整数类型
在Swift编程语言中,有符号整数类型
62 2
|
6月前
|
编译器 Swift
在Swift编程语言中,布尔类型
在Swift编程语言中,布尔类型
57 1
下一篇
无影云桌面