类型别名的目的

2023-12-13

我想今天我终于明白什么是 typealias 了。

我没有。

让我们看一个例子:

typealias Graph = [String: [String]]

let futurama: Graph = [
    "you": ["bender", "hermes", "scruffy"],
    "bender": ["hubert", "zoidberh"],
    "hermes": ["hubert", "amy", "scruffy"],
    "hubert": ["mom", "fry"],
    "fry": ["leela"],
    "leela": ["brannigan", "nibbler", "scruffy"],
    "amy": ["kif"],
    "brannigan": ["kif"],
    "zoidberh": [],
    "kif": [],
    "mom": [],
    "nibbler": [],
    "scruffy": []
]

extension Graph {
    // Breadth First Search
    func bfs(from start: String, to finish: String) -> [String]? { 
        // Implementation of this graph algorithm here
    }
}

print(
    futurama.bfs(from: "you", to: "scruffy")?.joined(separator: " --> ") ?? "There is no pass, sorry"
)

一切都很好。
然后我做了一个小改变:

let futurama: [String: [String]] = [
        "you": ["bender", "hermes", "scruffy"],
        "bender": ["hubert", "zoidberh"],
        ...

我现在就期待着futurama.bfs()不会编译,因为futurama没有方法bfs。我想,这门语言的设计多么巧妙啊!
但我很失望。没有改变。完全没有。该代码仍然可以编译并运行。
So...

  1. 类型别名有什么用?
  2. 如何实现我期望的行为?

根据文档(此处找到:https://docs.swift.org/swift-book/ReferenceManual/Declarations.html):

类型别名声明引入现有类型的命名别名 到你的程序中。

[...]

声明类型别名后,可以使用别名来代替 程序中随处可见的现有类型。现有类型可以 可以是命名类型或复合类型。类型别名不会创建新的 类型;它们只是允许用一个名称来引用现有的类型。

所以事实上你并没有定义一个新类型。您只需使用另一个名称为您的类型添加别名,以使该类型更易于使用。

所以在你的情况下Graph只是该类型的另一个别名[String: [String]]并且不会为您介绍新类型。

因此,为了实现您的期望,我想有很多可能性。一种方法是包裹你的Graph e.g. [String: [String]]到一个结构或类中,并编写该结构/类的扩展。您实现此目的的方式很大程度上取决于您想要实现的目标。

这回答了你的问题了吗?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

类型别名的目的 的相关文章

随机推荐

  • SAPUI5 为 TreeTable/空行创建 JSON

    我想从 JSON 请求创建 SAPUI TreeTable 目前我的输出如下所示 如您所见 每个节点都包含一个空行 gt 我不知道这是从哪里来的 我不想让这些空行行 我的表定义 Create an instance of the table
  • 有没有办法强制使用dll版本?

    有没有办法强制使用特定的 dll 版本 从应用程序配置 背景故事 我们正在使用 SQL Compact 3 5 由于业务原因 是的 我知道 暂时无法迁移到 SQL Compact 3 5 SP1 我们的构建目录中有 System Data
  • foreach 循环的角度链接承诺

    我有一组照片文件需要上传到 Azure 云存储 我使用 foreach 循环调用上传 如下所示 scope savetemplate function var imagePathsArray scope filesimage scope f
  • LinkedIn 共享显示大图像的要求

    我的问题是 为什么图像很小以及如何使其变大 我已经实现了linkedIn共享 为此 我添加了元标记 og title og image og description og url 一切正常 但我的形象很小 小图像示例 大图示例 我们已经向
  • 0.5 时向上或向下舍入

    我遇到了 Javascript 在达到 0 5 时对数字进行四舍五入的方式的问题 我正在编写征费计算器 并注意到结果有 0 1c 的差异 问题是他们的结果是21480 705我的应用程序翻译成21480 71 而关税说21480 70 这是
  • 确定-取消对话框:处理“Enter”键按下

    我正在建造一个Dialog在Winforms中 当您创建它时 它有两个 确定 和 取消 按钮 这就是我想要的 在此对话框中我还有一个TextBox and a Sub VB NET 中的编码 处理其KeyPress事件 我需要按下 Ente
  • 裸星号作为方法定义中的参数:def f(*) [重复]

    这个问题在这里已经有答案了 我知道这意味着什么 def f args end 但这是什么意思以及为什么要使用它 它也可以与命名参数一起出现吗 def f end def f 具有相同的效果def f args 只不过它没有命名通配参数数组
  • Flexdashboard 侧边栏选择器输入溢出与滚动条

    在我之前的问题中shinyWidgets pickerInput 宽度问题溢出侧边栏我能够解决侧边栏中的 pickerInput 框如果值太宽会在侧边栏中被截断的问题 但是通过使用overflow visible 为了解决这个问题 当输入框
  • 如何唯一标识 ContactsContract.Contacts 表上的联系人

    我有一个应用程序可以获取ContactsContract Contacts LOOKUP KEY设备上的联系人并将其保存在应用程序数据库中 看完之后this页面我想我可以使用LOOKUP KEY唯一标识联系人 即使在编辑联系人时 例如编辑联
  • 奇怪的浮点除法结果

    我在一个grails项目中发生了这个奇怪的除法错误 但我认为grails与它无关 我认为是一个groovy或java问题 如果在常规控制台中我运行这个 float money 1 30 float r 0 01 println money
  • 绑定祖先不工作 WPF

    我有一个 TreeView 它被修改为在文本前面显示图像 所以我修改后的TreeViewItem叫做ImagedTreeViewItem 此 ImagedTreeViewItem 有一个属性 其中包含要显示的图像控件的图像 ImagedTr
  • WebDriver 测试未在 IE11 上运行

    当我运行 WebDriver 测试时 它们根本不工作 到目前为止我所做的 1 我已更新我的注册表项以包含 FEATURE BFCACHE 2 所有区域的保护模式设置均相同 3 增强保护模式被禁用 4 我还尝试在我的 PATH 中设置 IED
  • 推荐用于 JavaScript 编码的 Vim 插件? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我是 JS 和 Vim 的
  • 当位置设置为固定时,导航栏会缩小

    我目前遇到一个问题 当我将导航栏和横幅的位置设置为固定时 它们会缩小 我有很多事情 例如更改 z index 将其顶部位置设置为 0 添加自动边距等 但这些都不起作用 我希望有人能指出我的错误 这是我的html代码 html body ma
  • 有没有办法对VBS中存储的密码进行加密

    我有一个在工作中使用的 VBS 脚本 用于在连接到 Cisco 路由器和交换机时自动执行任务 包括自动执行登录过程 人们对于将密码存储在纯文本 VBS 文件中有些紧张 这并非没有道理 因此我为他们提供了每次提示输入密码或将其存储在脚本中的选
  • Canvas.toDataURL() 未捕获类型错误:未定义不是函数

    我正在使用一个名为 html2canvas 的插件将页面上的一些 html 转换为 canvas 元素 然后我想将该画布保存为图像 不幸的是我一直遇到标题中的错误 我尝试过使用不同的变量名 不同的 html 等 但不断遇到相同的错误 这是我
  • 复制 local = false 文件未找到异常问题

    嗨 我知道这个已被询问但并没有得到答复 当我想使用安装在 C Program files x86 Dummu API dll 上的 dll 时遇到问题 当我运行我的应用程序时 它抛出异常 无法加载文件或程序集 Dummy API Versi
  • 硒点击表td内的锚标记

    我的 html 代码如下所示 div class fd food search all fd loading style display block ul class fd breadcrumbs li a href class bread
  • 如何“加入”一个数组,将第一个要加入的字符添加到结果字符串的开头?

    我正在使用 Ruby on Rails 3 并且正在尝试join一个数组 特点 我阅读了 Ruby 文档关于那个 我的数组是 name1 name2 If I do name1 name2 join 结果是 name1 name2 我希望结
  • 类型别名的目的

    我想今天我终于明白什么是 typealias 了 我没有 让我们看一个例子 typealias Graph String String let futurama Graph you bender hermes scruffy bender