swift - 类型别名的用途
问题描述
我以为今天我终于明白了 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
。多么聪明啊,我在想,多么伟大的语言设计啊!
但我很失望。没有改变。完全没有。代码仍然可以编译和工作。
所以...
- typealias 有什么用?
- 如何实现我期望的行为?
解决方案
根据文档(在此处找到:https ://docs.swift.org/swift-book/ReferenceManual/Declarations.html ):
类型别名声明将现有类型的命名别名引入您的程序。
[...]
声明类型别名后,可以在程序中的任何地方使用别名来代替现有类型。现有类型可以是命名类型或复合类型。类型别名不会创建新类型;它们只是允许名称引用现有类型。
所以实际上你并没有定义一个新类型。您只是用另一个名称为您的类型起别名,以使这种类型更易于使用。
因此,在您的情况下Graph
,这只是该类型的另一个别名,[String: [String]]
不会为您引入新类型。
因此,为了实现您的预期,我猜有很多可能性。一种方法是将您的Graph
eg包装[String: [String]]
到一个结构或类中,并为该结构/类编写扩展。您实现这一点的方式很大程度上取决于您想要实现的目标。
这回答了你的问题了吗?
推荐阅读
- c# - BizTalk 性能
- c++ - 如果用户在 Qt 中选择它,如何制作启动另一个组件的安装程序的安装程序
- go - 如何在 jwt-go ParseWithClaims 中使用 RSA 解析 JWT 令牌?
- python - 用Python删除字符串中相邻的重复单词?
- html - Razor Pages - 边输入边搜索
- java - 使用 DJL(Deep Java Library)时,哪个 Java 类与 python Pandas DataFrame 兼容?
- html - img 和 div 之间的空格
- java - Hazelcast将地址添加到黑名单并且客户端未连接
- next.js - 将哨兵添加到nextjs项目后无法运行服务器
- laravel - npm run dev:[webpack-cli] 错误:找不到模块“gensync”