类型别名的目的

Rom*_*man 1 type-alias 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"
)
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。多么聪明,我在想,多么棒的语言设计啊!
但我很失望。没有改变。在所有。代码仍然可以编译和工作。
所以...

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

Tee*_*etz 5

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

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

[...]

声明类型别名后,可以使用别名代替程序中任何地方的现有类型。现有类型可以是命名类型或复合类型。类型别名不会创建新类型;它们只是允许名称引用现有类型。

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

因此,在您的情况下,Graph它只是该类型的另一个别名,[String: [String]]并不会为您引入新类型。

因此,要实现您的预​​期,我想有很多可能性。一种方法是将您的Grapheg包装[String: [String]]到结构或类中,并为该结构/类编写扩展。您实现这一点的方式在很大程度上取决于您想要实现的目标。

这回答了你的问题了吗?