我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Swift 中 Opaque Types学习指南

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Swift 中 Opaque Types学习指南

什么是Opaque Types

Opaque Types 是在 Swift5.7 新添加的一个特性。主要是和 Protocol 来搭配使用,用来定义函数中的参数类型。它的作用就是隐藏参数的具体类型,从而使代码变得更加通用,减少冗余代码。废话不多说,下面来看一看它如何使用。

如何使用

假设我们有一个定义动物行为的 Protocol Behavior,有两个动物类 Cat 和 Dog 遵守了该协议:

protocol Behavior {
    func run()
}
struct Cat: Behavior {
    func run() {
        print("Cat run")
    }
}
struct Dog: Behavior {
    func run() {
        print("Dog run")
    }
}

如果我们想测试一下 run 的功能,可以通过使用 Opaque Types 来定义函数的参数,从而使测试函数可以接受 Cat 和 Dog 的实例对象:

func testRun(animal: some Behavior) {
    animal.run()
}
let cat = Cat()
let dog = Dog()
testRun(animal: cat) // Cat run
testRun(animal: dog) // Dog run

从上述代码可以看到,animal 的类型为 some Behavior。通过 some 关键字声明的类型就是所谓的 Opaque Types,some Behavior 的意思就是任何遵守了 Behavior 的类的实例对象。

看到这里,可能有的读者就会发现这个不是什么新奇的特性啊,这不就相当于泛型嘛?有这种想法的读者稍安勿躁,下面就来讲一下为什么要使用 Opaque Types。

为什么要使用

可读性更强

首先,下面的三个函数从语法层级上来说都是等价的:

func testRun(animal: some Behavior) {
    animal.run()
}
func testRun1<A: Behavior>(animal: A) {
    animal.run()
}
func testRun2<A>(animal: A) where A: Behavior {
    animal.run()
}

为什么使用的第一个原因就是:使用 some 定义更加清晰,使得代码可读性更高更容易理解。 上面的代码定义比较简单,可能感觉差别不大,大家看看下面的代码应该会有更深的体会?:

func encodeAnyDictionaryOfPairs(_ dict: [some Hashable & Codable: Pair<some Codable, some Codable>]) -> Data
func encodeAnyDictionaryOfPairs<_T1: Hashable & Codable, _T2: Codable, _T3: Codable>(_ dict: [_T1: Pair<_T2, _T3>]) -> Data

性能更好

还有一个重要的原因就是当 Opaque Types 当做返回值类型时它的限制比 Protocol 类型更加严格,比如下面的代码:

func testReturn(isCat: Bool) -> some Behavior { // 编译报错
    if isCat {
        return Cat()
    } else {
        return Dog()
    }
}
func testReturn1(isCat: Bool) -> Behavior { // 正常编译不会报错
    if isCat {
        return Cat()
    } else {
        return Dog()
    }
}

当编译器编译 testReturn 函数时,会报以下错误:

而 testReturn1 则不会报错。因为对于 Protocol 当做返回值来讲,不会强制要求所有分支返回同一类型的对象。

当 Opaque Types 做返回值时,虽然返回值的具体类型不做限制,即任何遵守 Behavior 协议的对象都可以,但所有的分支返回必须为同一类型的对象,即可能返回 Cat,又可能返回 Dog 是不允许的。

这样做的好处就是代码的性能更好,因为我们从底层限制了返回类型必须是同一类型,所以编译器处理起来会更快。

任何的事物都有两面性,Opaque Types 也不例外。最后我们来了解一下它的限制。

使用的限制

  • 不能用于可变参数的声明
  • 不用用于匿名函数的声明

总结

本篇文章,首先讲解了什么是 Opaque Types,然后又了解了它的使用方式,接着学习了它的优点:可读性更高;性能更好。最后说明了一下它的限制。 希望大家看完这篇文章,能在项目中多多实践。

参考链接

  • Apple Document
  • Swift evolution
  • understanding some and any

更多关于Swift Opaque Types的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Swift 中 Opaque Types学习指南

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Swift 中 Opaque Types学习指南

这篇文章主要为大家介绍了Swift 中 Opaque Types学习指南,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-14

Swift中Opaque Types怎么使用

今天小编给大家分享一下Swift中Opaque Types怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。什么是Opa
2023-07-05

Swift 中的 RegexBuilder学习指南

这篇文章主要为大家介绍了Swift中的RegexBuilder学习指南,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-14

MySQL学习指南

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Managem
MySQL学习指南
2016-11-25

最新HCNA学习指南

  最新HCNA学习指南:HCNA是华为认证体系中比较基础级别的认证,现在已经升级成hcia了。虽然说HCIA很基础,更鼓励大家去考HCIP或者HCIE,但是把HCIA的内容学好还是很重要的。要说学好HCIA,一些书籍就很有帮助,HCNA学习指南就是其中之一。在华为ICT认证系列丛书中,关于HCNA学习指南的有两本,一
最新HCNA学习指南
2024-04-18

华为交换机学习指南学习分享

  华为交换机学习指南学习分享。华为认证网络工程师们应该都不陌生,对于想要学习华为认证的朋友来说,相关的书籍一定是少不了的用来提升自己的学习工具,那今天要说的《华为交换机学习指南》就是其中的一本,那么这本书主要讲的是什么,要怎么用起来呢?接下来编程学习网小编就来给大家分享一下。   《华为交换机学习指南》的主要内
华为交换机学习指南学习分享
2024-04-18

4.《python自省指南》学习

前言  前面几篇博客我都是通过python自省来分析代码并试图得出结论。当然,仅仅通过自省能解决的问题有限,但遇到问题还是不自主的去用这个功能,觉得对于认识代码的含义还是有一定帮助的。而这些自省的知识我都是从python自省指南中学习的。所
2023-01-30

Swift中的协议(protocol)学习教程

一、引言 协议约定了一些属性与方法,其作用类似Java中的抽象类,Swift中类型通过遵守协议来实现一些约定的属性和方法。Swift中的协议使用protocol关键字来声明。Swift中的协议还有一个十分有意思的特性,协议可以通过扩展来实现
2022-06-04

sails框架的学习指南

上周通过搭建CMS系统接触到了sails框架,知道一些ORM的概念。这周开始深入后台数据交互,发现twenty框架的数据结构在sails上又设计了一番(比如node、category),不得不说师哥就是厉害。不过复杂度也提高了。而我在DTr
2022-06-04

华为路由器学习指南

  我们都知道,《华为路由器学习指南》是一本非常不错的书,编程学习网小编在给大家介绍这本书之前,先来说一说华为路由器。  华为路由器  目前华为路由器中国区市场排名第一,全球市场排名第二;可以说使用规模还是非常大的,中国区路由器市场近七成运营商和企业网NA客户部署使用华为路由器。华为路由器也多次获得SDN-VDC Info
华为路由器学习指南
2024-04-18

CCNA学习指南详细解析

  CCNA学习指南详细解析:《CCNA学习指南》是一本CCNA应试必备的学习指南,由Cisco技术知名权威编写,足以满足Cisco认证考试考生的全部需求。本书针对新的考试目标帮助应试者全面复习和掌握新的考试内容,除了讲解应掌握的内容外,几乎每章都有复习题、书面实验和动手实验,并附有答案。  《CCNA学习指南(640
CCNA学习指南详细解析
2024-04-18

学习Golang:简明入门指南

Golang(也称为Go)是一种由Google开发的开源编程语言,它具有高效的并发性能和简洁的语法特性,在近年来逐渐成为程序员们瞩目的热门选择。本文将介绍Golang的基本概念和语法特性,帮助初学者快速入门这门语言。1. Golang简介
学习Golang:简明入门指南
2024-02-23

GO语言学习指南:有效提升学习效率

1. 入门准备确保您拥有稳定的网络连接和一台能够运行 Go 语言编译器的计算机。安装 Go 语言编译器和开发环境。熟悉基本编程概念,如变量、数据类型、控制流和函数。2. 选择学习资源官方文档:Go 语言官方文档提供了全面的语言介绍和教程
GO语言学习指南:有效提升学习效率
2024-01-31

CSS中的position定位及用法学习指南

了解什么是CSS中的position定位及其用法,需要具体代码示例CSS(层叠样式表)是一种用于描述网页样式和布局的标记语言。在网页开发中,经常会使用CSS来控制元素的位置和布局。其中,position属性是CSS中常用的定位属性之一。本文
CSS中的position定位及用法学习指南
2023-12-27

DBA入职指南学习笔记3

1、数据库启动      加载参数文件(spfile、pfile)--nomount状态      加载控制文件(*.ctl)           --mount状态      加载数据文件、Redo log日志文件    ----open状态 2、实例  
DBA入职指南学习笔记3
2019-08-05

DBA入职指南学习笔记5

1、查看数据库是否是归档模式      archive log list; 2、将数据库更改为归档模式       alter database archivelog 3、数据库全备份      backup database 4、查看备份信息      li
DBA入职指南学习笔记5
2015-09-16

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录