首页 > 解决方案 > 类型别名的用途

问题描述

我以为今天我终于明白了 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。多么聪明啊,我在想,多么伟大的语言设计啊!
但我很失望。没有改变。完全没有。代码仍然可以编译和工作。
所以...

  1. typealias 有什么用?
  2. 如何实现我期望的行为?

标签: swifttype-alias

解决方案


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

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

[...]

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

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

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

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

这回答了你的问题了吗?


推荐阅读