【问题标题】:Swift generics: How to represent 'no type'?Swift 泛型:如何表示“无类型”?
【发布时间】:2021-10-01 08:52:01
【问题描述】:

我正在使用Google's promises 库,我想创建没有任何类型的承诺(因为我不需要任何类型)。

但是,我不得不选择某种类型:

let promise = Promise<SomeType>.pending()

当我需要承诺只是为了异步流和异常捕获,但我不想从功能? 例如,某些类型的唯一有效值为nil?

我在多个地方都遇到过这个问题,到目前为止,我发现的唯一解决方法是始终提供非泛型替代方案,但这会变得非常乏味并导致重复代码。

【问题讨论】:

  • 如果你想要一个不会返回任何东西的 Promise,那么你可以使用Nevernshipster.com/never
  • 我认为这个 Q&A 会浪费时间,除非您使用该库进行标记,或者提供一些我们更多人会熟悉的案例。我在想 Fogmeister 所说的,或 Void,但我不知道这是否会对你有所帮助。
  • Never 是 0 有效值的类型,所以它永远不能被创建。 void 类型恰好有 1 个可能的值,因此用于使函数成为过程(不返回任何有用的值,它们返回 void)
  • 啊,我认为@Shadowrun 在这里是正确的。您可能想要 Void 而不是 Never。
  • @Shadowrun Void 是我需要的,我不知道如何用谷歌搜索它:)。谢谢!如果你写出来,我很乐意为你挑选答案:)。

标签: swift generics


【解决方案1】:

类型值的集合,比如Int是所有整数的集合,String是所有字符序列的集合等等。

如果考虑集合中的项目数,有一些特殊类型,0 项目和 1 项目,在这种特殊情况下很有用。

Never 是其中没有值的类型。无法构造 Never 类型的实例,因为它没有可以是的值(就像没有案例的枚举一样)。这对于将情况、代码流等标记为“不可能发生”很有用,例如编译器可以知道返回 Never 的函数永远不会返回。或者永远无法调用采用Never 的函数。返回 Result&lt;Int, Never&gt; 的函数永远不会失败,但在返回 Result 类型的函数世界中。但是因为永远无法构建它不是你想要的。这将意味着一个无法实现的承诺。

Void 是只有 1 个值的类型。它通常在函数定义的左侧拼写为(),在右侧拼写为Void。 void 的值并不有趣。制作一个返回Void 的函数很有用,因为它们就像其他语言调用的子例程或过程一样。在这种情况下,它意味着可以实现但没有任何价值的 Promise。因此,它只能对副作用有用。

【讨论】:

  • 非常感谢!我将添加一个我需要的使用示例:function soSomethingAsync() -&gt; Promise&lt;Void&gt; { ... return Promise&lt;Void&gt;(()) }
【解决方案2】:

如果我们创建一个空类,这是一个正确的解决方案还是解决方法

类 Default_Class : 可编码 {

}

并将其用作 Promise.pending

【讨论】:

  • 我认为没有必要。您可以使用Void 作为类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多