Swift:创建类型别名后禁止使用原始类名

Swift: Forbid use of original class name after creating a typealias

提问人:sudocu 提问时间:4/6/2023 最后编辑:sudocu 更新时间:4/8/2023 访问量:89

问:

在创建类型别名后,是否可以在 Swift 中禁止在我的程序中使用原始类名?

你好

为了避免在我的程序中类名的使用不一致,我想在我的程序中强制系统地使用别名而不是原始类名。有可能这样做吗?

我正在使用一个外部库,其中有一个类并不完全是它应该做的事情:库中该类的名称对我来说似乎不正确。我该如何处理?

例如。一个具有函数而不是 的类,我想重命名它,然后在我的程序中以独占方式调用。DogmeowsbarksCatCat

swift 类型别名

评论

1赞 Sweeper 4/6/2023
这听起来非常像一个 XY 问题。请解释一下为什么要禁止这样做?是否发生了一些名称冲突?如果是这样,请展示一个最小的可重复示例
0赞 Sweeper 4/6/2023
另外,你说的“在”创建类型别名之后是什么意思?编译代码时没有时间概念。你想在哪里(哪些范围)禁止这样做?如果你能通过编辑来回答这个问题,那就更清楚了。
0赞 Geoff Hackworth 4/6/2023
如果你想“强制”你的代码为一个类使用一个新名称,那么你可以简单地重命名它,你的应用程序不会编译,直到你修复了所有使用旧名称的地方!您甚至可以使用 Xcode 的重构工具,它应该重命名所有匹配项,包括情节提要中。
1赞 Caleb 4/7/2023
这是一个有趣的问题,但如果有一些代码来演示这个问题,它会得到很大的改进。
1赞 Caleb 4/8/2023
@Sweeper 有一个时间的概念,或者至少是编译顺序。显然,如果不引用 ,就无法建立类型别名,并且必须编译其自身的代码,但是 OP 希望 OP 希望使用无法访问的代码。CatDogDogCatDog

答:

4赞 Rob Napier 4/7/2023 #1

像这样应用一致的样式是 linter 的工作,而不是编译器的工作。对于 swiftlint,您可以按照这些思路编写规则。(这是未经测试的,但基于文档中的示例。pirates_beat_ninjas

custom_rules:
  cats_not_dogs:
    included: 
      - ".*\\.swift" 
    name: "Use Cat rather than Dog"
    regex: "Dog"
    match_kinds:
      - identifier
    message: "Use Cat rather than Dog."
    severity: error
4赞 Caleb 4/8/2023 #2

我正在使用一个外部库,其中有一个类并不完全是它应该做的事情:库中该类的名称对我来说似乎不正确。我该如何处理?

一种选择是创建你自己的库,包装有问题的库,只公开你的名字。

由于您的问题被标记为 ,因此我假设我们实际上在这里谈论的是 Swift 包。假设您正在使用的包称为 ,并且它包含一个类 ,您更愿意将其称为 。您可以创建一个新包,例如,它包含如下文件:CanineDogCatFelineFeline.swift

import Canine

public typealias Cat = Dog

现在,您可以将包添加到您的应用,以及任何需要它的源文件。该包将作为依赖项添加到应用中,但只要您不添加到源文件,编译器就会阻止您直接使用。Felineimport FelineCanineimport CanineDog

这似乎很麻烦,只是因为你不喜欢一个类的名字。即便如此,我还是可以想象出一些值得付出努力的原因,例如:

  • 其中许多名字都选得不好;Canine

  • 您的公司最近被收购,并且您想要重命名库中的类型以包含新名称或隐藏旧名称;

  • 您有多个不同的库来构建应用,而无需更改源代码中的名称。(在这种情况下,协议可能是更好的选择。