我想今天我终于明白什么是 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"
)
Run Code Online (Sandbox Code Playgroud)
一切都很好。
然后我做了一个小改动:
let futurama: [String: [String]] = [
"you": ["bender", "hermes", "scruffy"],
"bender": ["hubert", "zoidberh"],
...
Run Code Online (Sandbox Code Playgroud)
我原以为现在futurama.bfs()不会编译,因为futurama没有 method bfs。多么聪明,我在想,多么棒的语言设计啊!
但我很失望。没有改变。在所有。代码仍然可以编译和工作。
所以...
根据文档(在这里找到:https : //docs.swift.org/swift-book/ReferenceManual/Declarations.html):
类型别名声明将现有类型的命名别名引入到您的程序中。
[...]
声明类型别名后,可以使用别名代替程序中任何地方的现有类型。现有类型可以是命名类型或复合类型。类型别名不会创建新类型;它们只是允许名称引用现有类型。
所以实际上你并没有定义一个新的类型。您只是使用另一个名称为您的类型添加别名,以使这种类型更易于使用。
因此,在您的情况下,Graph它只是该类型的另一个别名,[String: [String]]并不会为您引入新类型。
因此,要实现您的预期,我想有很多可能性。一种方法是将您的Grapheg包装[String: [String]]到结构或类中,并为该结构/类编写扩展。您实现这一点的方式在很大程度上取决于您想要实现的目标。
这回答了你的问题了吗?