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

Swift中的类型占位符怎么使用

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

Swift中的类型占位符怎么使用

本篇内容介绍了“Swift中的类型占位符怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

Swift 的类型推断能力从一开始就是语言的核心部分,它极大地减少了我们在声明有默认值的变量和属性时手动指定类型的工作。例如,表达式var number = 7不需要包含任何类型注释,因为编译器能够推断出值7是一个Int,我们的number变量应该被相应的类型化。

作为 Xcode 13.3 的一部分而一起发布的 Swift 5.6,通过引入 "类型占位符(type placeholders) "的概念,继续扩展这些类型推理能力,这在处理集合和其他通用类型时非常有用。

例如,假设我们想创建一个Combine里面具有默认整数值的 CurrentValueSubject的实例。关于如何做到这一点的初步想法可能是简单地将我们的默认值传递给该主体的初始化器,然后将结果存储在本地的一个let声明的属性中(就像创建一个普通的Int值时一样)。然而,这样做会给我们带来以下编译器错误:

// Error: "Generic parameter 'Failure' could not be inferred"// Error: “无法被推断出泛型的`Failure`参数 ”let counterSubject = CurrentValueSubject(0)

这是因为CurrentValueSubject是一个泛型类型,实例化时不仅需要Output类型,还需要Failure类型——这是该主体能够抛出的错误类型。

因为我们不希望我们的主体在这种情况下抛出任何错误,所以我们会给它一个Failure类型的值Never(这是在 Swift 中使用 Combine 的一个常见惯例)。但为了做到这一点,在 Swift 5.6 之前,我们需要明确地指定我们的Int输出类型——像这样:

let counterSubject = CurrentValueSubject<Int, Never>(0)

不过从 Swift 5.6 开始,这种情况就不存在了&mdash;&mdash;因为我们现在可以使用一个类型占位符来表示我们主体的Output类型,这让我们再次利用编译器为我们自动推断出该类型,就像在声明一个普通的Int值一样:

let counterSubject = CurrentValueSubject<_, Never>(0)

这很好,但可以说这并不是 swift 里面很大的改进。毕竟,我们用_代替Int只是节省了两个字符,而且手动指定像Int这样的简单类型也不是一开始就有问题的。

**但现在让我们看看这个功能如何扩展到更复杂的类型,这是它真正开始发光的地方。**例如,假设我们的项目包含以下函数,让我们加载一个用户注解的PDF文件:

func loadAnnotatedPDF(named: String) -> Resource<PDF<UserAnnotations>> {    ...}

上面的函数使用了一个相当复杂的泛型作为它的返回类型,这可能是因为我们需要在多个地方中重复使用我们的Resource类型,也因为我们选择了使用*幻象类型*来指定我们当前处理的是哪种PDF。

现在让我们看看,如果我们在创建主体时调用上述函数,而不是仅仅使用一个简单的整数,那么我们之前基于CurrentValueSubject的代码会是什么样子:

// Before Swift 5.6:let pdfSubject = CurrentValueSubject<Resource<PDF<UserAnnotations>>, Never>(    loadAnnotatedPDF(named: name))// Swift 5.6:let pdfSubject = CurrentValueSubject<_, Never>(    loadAnnotatedPDF(named: name))

这是一个相当大的改进啊 基于 Swift 5.6 的版本不仅为我们节省了一些输入,而且由于 pdfSubject 的类型现在完全来自 loadAnnotatedPDF 函数,这可能会使该函数(及其相关代码)的迭代更加容易&mdash;&mdash;因为如果我们改变该函数的返回类型,需要更新的手动类型注释将减少。

不过,值得指出的是,在上述情况下,还有另一种方法可以利用Swift的类型推理能力&mdash;&mdash;那就是使用类型别名,而不是类型占位符。例如,我们可以在这里定义一个UnfailingValueSubject类型别名,我们可以用它来轻松地创建不会产生任何错误的主体:

typealias UnfailingValueSubject<T> = CurrentValueSubject<T, Never>

有了上述内容,我们现在就可以在没有任何泛型注解的情况下创建我们的pdfSubject了&mdash;&mdash;因为编译器能够推断出T指的是什么类型,而且失败类型Never已经被硬编码到我们的新类型别名中:

let pdfSubject = UnfailingValueSubject(loadAnnotatedPDF(named: name))

但这并不意味着类型别名在通常情况下都比类型占位符好,因为如果我们要为每种特定情况定义新的类型别名,那么这也会使我们的代码库变得更加复杂。有时,在内联中指定所有的东西(比如使用类型占位符时)绝对是个好办法,因为这可以让我们定义完全独立的表达式。

在我们总结之前,让我们也来看看类型占位符是如何与集合字面量(literals)一起使用的&mdash;&mdash;例如在创建一个字典时。在这里,我们选择手动指定我们的字典的 Key 类型(为了能够使用点语法来指代枚举的各种情况),同时为该字典的值使用一个类型占位符:

enum UserRole {    case local    case remote}let latestMessages: [UserRole: _] = [    .local: "",    .remote: ""]

这就是类型占位符&mdash;&mdash;Swift 5.6 中引入的一个新功能,在处理稍微复杂的通用类型时,它可能真的很有用。但值得指出的是,这些占位符只能在调用站点使用,而不是在指定函数或计算属性的返回类型时使用。

“Swift中的类型占位符怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

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

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

Swift中的类型占位符怎么使用

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

下载Word文档

猜你喜欢

Swift中的类型占位符怎么使用

本篇内容介绍了“Swift中的类型占位符怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Swift 的类型推断能力从一开始就是语言的核
2023-07-02

python数字类型和占位符怎么用

这篇文章主要介绍python数字类型和占位符怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、数据类型1.数据类型的判断Number => int float complex bool容器 => str lis
2023-06-29

python中占位符的使用

小明的成绩从去年的72分提升到了今年的85分,请计算小明成绩提升的百分点,并用字符串格式化显示出'xx.x%',只保留小数点后1位:# -*- coding: utf-8 -*-s1 = 72s2 = 85解:r = (s2-s1)/s2*
2023-01-31

html空格占位符怎么使用

在 HTML 中,空格占位符可以用来在文本中创建空格,而不会被浏览器忽略。可以使用以下两种方法来创建空格占位符:1. 使用实体名称:可以使用实体名称 ` ` 来创建空格占位符。例如,以下代码将在文本中创建四个空格:```This is
2023-06-10

Golang中的占位符如何使用

这篇文章主要讲解了“Golang中的占位符如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang中的占位符如何使用”吧!基本常见常用的占位符%s%d%v , %v+ , %+v%
2023-07-05

golang中fmt格式“占位符”怎么用

这篇文章主要为大家展示了“golang中fmt格式“占位符”怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“golang中fmt格式“占位符”怎么用”这篇文章吧。golang 的fmt 包实
2023-06-20

golang占位符有哪些及怎么使用

这篇文章主要介绍“golang占位符有哪些及怎么使用”,在日常操作中,相信很多人在golang占位符有哪些及怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”golang占位符有哪些及怎么使用”的疑惑有所
2023-07-05

深入了解Golang中占位符的使用

在写 golang 的时候,也是有对应的格式控制符,也叫做占位符,写这个占位符,需要有对应的数据与之对应,不能瞎搞。本文就来和大家聊聊Golang中占位符的使用,希望对大家有所帮助
2023-03-11

怎么在python中将切片作为占位符使用

这篇文章给大家介绍怎么在python中将切片作为占位符使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,Python对代码格式的要求没
2023-06-14

C++中new类型的运算符怎么使用

这篇文章主要介绍“C++中new类型的运算符怎么使用”,在日常操作中,相信很多人在C++中new类型的运算符怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++中new类型的运算符怎么使用”的疑惑有所
2023-06-29

在PowerPoint的幻灯片中占位符有什么用

小编给大家分享一下在PowerPoint的幻灯片中占位符有什么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!占位符的作用是:为文本、图形预留位置。占位符是先占住一个固定的位置,等着再往里面添加内容的符号;在幻灯片中,就表
2023-06-14

C++11的auto类型修饰符怎么使用

本篇内容主要讲解“C++11的auto类型修饰符怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++11的auto类型修饰符怎么使用”吧!功能介绍C++11提供一了auto类型修饰符,可
2023-06-19

Swift中的RegexBuilder怎么正确使用

本篇内容主要讲解“Swift中的RegexBuilder怎么正确使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Swift中的RegexBuilder怎么正确使用”吧!前言在我们日常的项目开发
2023-07-05

怎么使用C++中的string类型

这篇文章主要讲解了“怎么使用C++中的string类型”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用C++中的string类型”吧!1、string 类1.1 和char *的异同在
2023-06-25

java中移位运算符怎么使用

Java中的移位运算符有三种:左移位运算符(>)和无符号右移位运算符(>>>)。它们用于将一个二进制数向左或向右移动指定的位数。1. 左移位运算符(示例:int a = 5; int b = a 2. 右移位运算符(>>):将一个数的二进制
2023-09-26

php中怎么使用位运算符中的^和&

这篇文章给大家分享的是有关php中怎么使用位运算符中的^和&的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。位操作是程序设计中对位模式按位或二进制数的一元和二元操作。在许多古老的微处理器上,位运算比加减运算略快,
2023-06-20

golang中rune类型怎么使用

本篇内容介绍了“golang中rune类型怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!golang中rune类型在golang中r
2023-06-21

编程热搜

  • 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动态编译

目录