swift 类型转换

Swift 类型转换 这两个操作符也用于将实例转换为指定的类型,但是它们返回的是一个可选类型(Optional)。将强制转换为指定类型,如果转换失败,会导致运行时错误。它允许我们检查实例的类型,并在必要时将其视为其父类或子类的类型。我们使用 is 操作符检查实例的类型,并使用 as 操作符将实例向上转型或向下转型。as:用于将实例转换为指定的类型。如果实例可以转换为该类型,返回转换后的实例;请注意,向下转型时,如果实例的类型与目标类型不兼容,使用 as?如果实例属于该类型,返回 true,否则返回 false。 阅读详情

定义一个类层次作为例子

你可以将类型转换用在类和子类的层次结构上,检查特定类实例的类型并且转换这个类实例的类型成为这个层次
结构中的其他类型。下面的三个代码段定义了一个类层次和一个包含了这些类实例的数组,作为类型转换的例
子。

第一个代码片段定义了一个新的基类 MediaItem 。这个类为任何出现在数字媒体库的媒体项提供基础功能。特别的,它声明了一个 String 类型的 name 属性,和一个 init(name:) 初始化器。(假定所有的媒体项都有个名称。) 

   class MediaItem {
        var name: String
        init(name: String) {
            self.name = name
        }
    }

下一个代码段定义了 MediaItem 的两个子类。第一个子类 Movie 封装了与电影相关的额外信息,在父类(或者说基类)的基础上增加了一个 director (导演)属性,和相应的初始化器。第二个子类 Song ,在父类的基础上增加了一个 artist (艺术家)属性,和相应的初始化器: 

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

最后一个代码段创建了一个数组常量 library,包含两个 Movie 实例和三个 Song 实例。library 的类型是在它被初始化时根据它数组中所包含的内容推断来的。Swift 的类型检测器能够推断出 Movie 和 Song 有共同的父类 MediaItem ,所以它推断出 [MediaItem] 类作为 library 的类型: 

 let library = [
     Movie(name: "Casablanca", director: "Michael Curtiz"),
     Song(name: "Blue Suede Shoes", artist: "Elvis Presley"),
     Movie(name: "Citizen Kane", director: "Orson Welles"),
     Song(name: "The One And Only", artist: "Chesney Hawkes"),
     Song(name: "Never Gonna Give You Up", artist: "Rick Astley")
]

在幕后 library 里存储的媒体项依然是 Movie 和 Song 类型的。但是,若你迭代它,依次取出的实例会是MediaItem 类型的,而不是 Movie 和 Song 类型。为了让它们作为原本的类型工作,你需要检查它们的类型

或者向下转换它们到其它类型,就像下面描述的一样。

检查类型

用类型检查操作符( is )来检查一个实例是否属于特定子类型。若实例属于那个子类型,类型检查操作符返回

true ,否则返回 false 。

下面的例子定义了两个变量,movieCount 和 songCount,用来计算数组 library 中 Movie 和 Song 类型的实例数量: 

    var movieCount = 0
        var songCount = 0
        
        for item in library {
            if item is Movie {
                movieCount += 1
            } else if item is Song {
                songCount += 1
            }
        }

示例迭代了数组 library 中的所有项。每一次,for-in 循环设置 item 为数组中的下一个 MediaItem。

若当前 MediaItem 是一个 Movie 类型的实例, item is Movie 返回 true ,否则返回 false 。同样的,em is Song 检查 item 是否为 Song 类型的实例。在循环结束后, movieCount 和 songCount 的值就是被找到的属于各自类型的实例的数量。 

向下转型

某类型的一个常量或变量可能在幕后实际上属于一个子类。当确定是这种情况时,你可以尝试向下转到它的子类

型,用类型转换操作符(as? 或 as!)。因为向下转型可能会失败,类型转型操作符带有两种不同形式。条件形式as? 返回一个你试图向下转成的类型的

可选值。强制形式 as! 把试图向下转型和强制解包(转换结果结合为一个操作。当你不确定向下转型可以成功时,用类型转换的条件形式( as? )。条件形式的类型转换总是返回一个可选

值,并且若下转是不可能的,可选值将是 nil 。这使你能够检查向下转型是否成功。只有你可以确定向下转型一定会成功时,才使用强制形式( as! )。当你试图向下转型为一个不正确的类型

时,强制形式的类型转换会触发一个运行时错误。

下面的例子,迭代了 library 里的每一个 MediaItem,并打印出适当的描述。要这样做,item 需要真正作为Movie 或 Song 的类型来使用,而不仅仅是作为 MediaItem 。为了能够在描述中使用 Movie 或 Song 的director 或 artist 属性,这是必要的。

在这个示例中,数组中的每一个 item 可能是 Movie 或 Song 。事前你不知道每个 item 的真实类型,所以这里使用条件形式的类型转换( as? )去检查循环里的每次下转: 

for item in library {
    if let movie = item as? Movie {
        print("Movie: '\(movie.name)', dir. \(movie.director)")
    } else if let song = item as? Song {
        print("Song: '\(song.name)', by \(song.artist)")
    }
}

示例首先试图将 item 下转为 Movie 。因为 item 是一个 MediaItem 类型的实例,它可能是一个 Movi
e ;同样,它也可能是一个 Song ,或者仅仅是基类 MediaItem 。因为不确定, as? 形式在试图下转时将返回一个可选值。 item as? Movie 的返回值是 Movie? 或者说“可选 Movie ”。

当向下转型为 Movie 应用在两个 Song 实例时将会失败。为了处理这种情况,上面的例子使用了可选绑定(optional binding)来检查可选 Movie 真的包含一个值(这个是为了判断下转是否成功。)可选绑定是这样写的“ if let movie = item as? Movie ”,可以这样解读:

“尝试将 item 转为 Movie 类型。若成功,设置一个新的临时常量 movie 来存储返回的可选 Movie 中的值”

若向下转型成功,然后 movie 的属性将用于打印一个 Movie 实例的描述,包括它的导演的名字 director 。相似的原理被用来检测 Song 实例,当 Song 被找到时则打印它的描述(包含 artist 的名字)。 

Any和AnyObject的类型转换

Swift 为不确定类型提供了两种特殊的类型别名:

• Any 可以表示任何类型,包括函数类型。• AnyObject 可以表示任何类类型的实例。

只有当你确实需要它们的行为和功能时才使用 Any 和 AnyObject 。在你的代码里使用你期望的明确类型总是更好的。

这里有个示例,使用 Any 类型来和混合的不同类型一起工作,包括函数类型和非类类型。它创建了一个可以存储 Any 类型的数组 things : 

var things = [Any]()
things.append(0)
things.append(0.0)
things.append(42)
things.append(3.14159)
things.append("hello")
things.append((3.0, 5.0))
things.append(Movie(name: "Ghostbusters", director: "Ivan Reitman"))
things.append({ (name: String) -> String in "Hello, \(name)" })

things 数组包含两个 Int 值,两个 Double 值,一个 String 值,一个元组 (Double, Double) ,一个 Movie 实例“Ghostbusters”,以及一个接受 String 值并返回另一个 String 值的闭包表达式。

你可以在 switch 表达式的 case 中使用 is 和 as 操作符来找出只知道是 Any 或 AnyObject 类型的常量或变量的具体类型。下面的示例迭代 things 数组中的每一项,并用 switch 语句查找每一项的类型。有几个 switch 语句的 case 绑定它们匹配到的值到一个指定类型的常量,从而可以打印这些值: 

 for thing in things {
     switch thing {
     case 0 as Int:
         print("zero as an Int")
     case 0 as Double:
         print("zero as a Double")
     case let someInt as Int:
         print("an integer value of \(someInt)")
     case let someDouble as Double where someDouble > 0:
         print("a positive double value of \(someDouble)")
     case is Double:
         print("some other double value that I don't want to print")
     case let someString as String:
         print("a string value of \"\(someString)\"")
     case let (x, y) as (Double, Double):
         print("an (x, y) point at \(x), \(y)")
     case let movie as Movie:
         print("a movie called '\(movie.name)', dir. \(movie.director)")
     case let stringConverter as String -> String:
         print(stringConverter("Michael"))
     default:
         print("something else")
     }
}

选自《the swift programming language》中文版










FPGA—DHT11数字温湿度传感器 1. DH1T11温湿度传感器与DS18B20温湿度传感器非常类似,都是严格按照时序要求写代码。建议可以比较学习。2. 显示温度与湿度部分的数据处理,采用 X10 进行在数码管上的移一位显示,配合了数码管小数部分的显示特点又区分了温度与湿度。3. 程序是按照一个接一个状态及顺序跳转的,建议使用状态机。说明:本人使用的是野火家Xilinx Spartan6系列开发板及配套教程,以上内容如有疑惑或错误欢迎评论区指出,或者移步B站观看野火家视频教程。 阅读详情

相关推荐

工业级24V电源保护电路深度解析:五重防护机制详解

自恢复保险丝(PPTC,Positive Temperature Coefficient)是一种过流保护元件✅可恢复:过流后自动恢复,无需更换⚡响应快:电流超标立即动作🔄多次使用:在额定范围内可反复使用第1层(F1):阻挡过流 → 物理熔断第2层(D3):吸收浪涌 → 能量泄放第3层(Q1):防止反接 → 逻辑阻断第4层(Q2/Q3):抵御过压 → 主动切断第5层(CR):平滑启动 → 时序控制设计哲学:"让每一级保护专注做好一件事"通过这篇文章,我们深入理解了:✅自恢复保险丝。

qq_58068673的博客 3563

Swift里类型转换

类型转换在 Swift 中使用is和as操作符实现。这两个操作符分别提供了一种简单达意的方式去检查值的类型或者转换它的类型。(用于check?) 为类型转换定义类层次 将类型转换用在类和子类的层次结构上,检查特定类实例的类型并且转换这个类实例的类型成为这个层次结构中的其他类型。(父类转换为子类或子类转成父类去处理?) //媒体父类 class MediaItem { var name: String init(name: String) { self.name...

1321

Calibre电子书阅读器个性化样式定制指南

本文详细介绍了如何通过Calibre电子书阅读器的用户样式表功能进行深度个性化样式定制。从修改全局字体、行距、背景配色(包括深色/浅色模式)到美化代码块、引用等特殊元素,本指南提供了完整的CSS代码示例与实战技巧,帮助用户打造专属的舒适阅读环境,显著提升电子书阅读体验。

vv45678的博客 920

swift学习笔记(17)- 类型转换

定义一个类层次作为例子你可以将类型转换用在类和子类的层次结构上,检查特定类实例的类型并且转换这个类实例的类型成为这个层次结构中的其他类型。下面的三个代码段定义了一个类层次和一个包含了这些类实例的数组,作为类型转换的例子。class MediaItem { var name: String init(name: String) { self.name = name

IT_201607的博客 565

jetson agx orin开箱及接口介绍

jetson agx orin开箱及接口介绍

qq_58728069的博客 1万+

Unity Spine 3.8 (URP) 踩坑(Shader报错修改)

提供了新思路,打算尝试一下URP。但美术使用的spine版本是3.8,项目用的Unity2021.3.11f1c2,直接导入spine URP包,shader报错:half4 不能转成 SurfaceData2D;Spine-Sprite-StandardPass-URP-2D.hlsl 也报这个错,也是同样的改法即可。今天搜索spine优化,看到一篇文章。

hrlr1230的博客 4564

Swift基础知识:26.Swift类型转换

类型转换是 Swift 中用于将实例从一种类型转换为另一种类型的重要操作。和 is,我们可以在需要时安全地进行类型转换或者检查实例的类型,避免因为类型不匹配而导致的运行时错误。在 Swift 中,类型转换是指将一种类型的实例转换为另一种类型的操作。Swift 提供了三种类型转换操作:as?is 用于检查实例是否属于某种类型。如果实例属于指定类型,返回。

长沙火山 1049

AI工具 | 每个打工人必备的15款人工智能超级工具

不过,还是有一些靠谱的人工智能平台,它们可不只是营销噱头。有些AI公司正试图改变游戏规则。人工智能工具让人们能够更聪明地工作,而不是更辛苦地劳作。如果你想知道未来有什么,那就来看看这10款人工智能工具吧,它们将彻底改变我们的工作方式。

Vampire_2017的博客 5万+

[Swift]常见数据类型之间的转换

// Data转JSON字符串 func DataToJSONString(data: Data) -> String? { let JSONString = String(data: data, encoding: String.Encoding(rawValue: String.Encoding.utf8.rawValue)); return JSONString; }...

Gamin 6237

Python 爬虫实战:社交媒体(Facebook)评论数据抓取与情感分析

在当今数字化时代,社交媒体平台如 Facebook 已成为人们日常生活中不可或缺的一部分。它不仅是人们分享生活点滴、交流思想的场所,也为企业和研究人员提供了丰富的数据资源。通过分析社交媒体上的评论数据,我们可以了解用户的情感倾向、产品反馈以及社会热点话题等。本文将详细介绍如何使用 Python 爬虫技术抓取 Facebook 上的评论数据,并进行情感分析。这不仅是一次技术实战,更是一次数据探索之旅。

yansideyucsdn的博客 671

NXP S32k3 MCAL EMIOS PWM配置

NXP s32k 配置 EMIOS PWM

Leon_0125的博客 2693

Swift类型转换

关于「类型转换」(Type Casting),《The Swift Programming Language》描述如下: Type castingis a way to check the type of an instance, and/or to treat that instance as if it is a different superclass or subclas...

dingzhengkuang5981的博客 282

5ZCM6ZGrVDllSFLkv6Hmga/ljJbnrqHnkIbns7vnu58= GetFlowDropDown SQL注入

5ZCM6ZGrVDllSFLkv6Hmga/ljJbnrqHnkIbns7vnu58=、eHR/OA一体化智慧云平台、智慧一卡通云平台、行业软件开发与定制、智慧企业管理信息化咨询与项目服务为核心业务的顾问式管理咨询和软件个性定制开发的高科技股份集团公司。同鑫T9eHR信息华管理系统存在SQL注入漏洞,攻击者可通过该漏洞上传shell。关闭互联网暴露面或接口设置访问权限。利用sqlmap进行shell。

iSee857的博客 698

swift 对象转换_Swift类型转换–照原样,任何对象

swift 对象转换In this tutorial, we’ll be looking into the details of Swift Type Casting. Let’s get started on our Xcode Playground! 在本教程中,我们将研究Swift Type Casting的细节。 让我们开始在我们的Xcode Playground! 什么是Swift类...

从零开始的教程世界 504

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Swift - 类型转换

我们暂时还不太可能脱离Cocoa 框架,而Swift 有着较强类型安全特性,其实这本质上和Objective-C 时代的Cocoa 框架是不太相符合的。在Objective-C 里我们可以简单的使用id 指代一切类型,在使用时如果我们可以完全确定的话,只需要声明并使用合适类型的指针就可以了。但是在Swift 里就要麻烦一些,我们经常需要进行向下的类型转换。比如下面这段代码在Objective-C 中再普通不过了: for (UIView *view in self.view.subviews) {

HumorousGhost 792

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

swift2 类型转换

class MediaItem { var name: String init(name: String) { self.name = name } } class Movie: MediaItem { var director: String init(name: String, director: String) { se

wangxiaobupt的专栏 715

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

swift html 转换,Swift 类型转换

Swift 类型转换Swift 语言类型转换可以判断实例的类型。也可以用于检测实例类型是否属于其父类或者子类的实例。Swift 中类型转换使用 is 和 as 操作符实现,is 用于检测值的类型,as 用于转换类型。类型转换也可以用来检查一个类是否实现了某个协议。定义一个类层次以下定义了三个类:Subjects、Chemistry、Maths,Chemistry 和 Maths 继承了 Subje...

weixin_39617113的博客 150

Swift- 类型转换

override func viewDidLoad() { super.viewDidLoad() //类型转换运算符: is, as //可以用类型转换检查实例类型, 或者一个类型是否服从协议 class MediaItem { var name: String ...

Lee优快云77的博客 1089

Swift-类型转换

类型转换可以判断实例的类型,也可以将实例看做是其父类或者子类的实例。 类型转换在 Swift 中使用 is 和 as 操作符实现。 也可以用它来检查一个类型是否遵循了某个协议。 1. 为类型转换定义类层次 可以将类型转换用在类和子类的层次结构上,检查特定类实例的类型并且转换这个类实例的类型成为这个层次结构中的其他类型。 /* 这个类为任何出现在数字媒体库的媒体项提供基础功能。 特别的,它声...

hkasdfiu12 213

Swift的String类型转换如何实现?

随着swift2.0的问世,越来越多的开发者使用这门语言进行iOS应用开发,在开发中我们常常需要用到各种字符串、类、接口等等,今天小编和大家分享的就是swift2.0中String的类型转换方法,一起来看看吧。          其实,swift语言属于强类型语言,但简单的String类型转换其实还是比较方便的,最暴力的就是强制类型转换,百试百灵:   functoString(a:

qwemaizi的博客 1827

Swift编程十九(类型转换)

案例代码下载 类型转换 类型转换是一种检查实例类型的方法,或者将该实例视为与其自己的类层次结构中的其他位置不同的超类或子类。 Swift中的类型转换是使用is和as运算符实现的。这两个运算符提供了一种简单而富有表现力的方法来检查值的类型或将值转换为其他类型。 还可以使用类型转换来检查类型是否符合协议,如检查协议一致性中所述。 为类型转换定义类层次结构 可以使用类型转换来检查特定类实例在类和子类的层...

jiuchabaikaishui的专栏 297
上一篇: ios 取得当前界面方法
下一篇: swift 扩展
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值