【问题标题】:Is there an equivalent in swift to Go's empty interface?Go 的空界面是否有 swift 的等价物?
【发布时间】:2020-04-17 17:24:27
【问题描述】:

在 Swift 中是否有类似的方法可以像在 Go 中一样将空接口作为参数传递?

【问题讨论】:

  • 你想达到什么目的?
  • 答案是Any,但你几乎肯定不想要这个。 interface{} 解决了在 Swift 中以完全不同的方式解决的问题。
  • @NoemiPecorari 这可能不是你想在 Swift 中做的事情。您必须将Any 值转换为函数类型,并且您很难知道将其转换为什么。你想用这个功能实现什么?
  • @NoemiPecorari 你需要重新设计。即使在 Go 中,我也不认为这是正确的设计。您希望对“字面上的任何功能”做什么?如果不首先知道它的形状,你就无法调用它或从中获得结果。如果你知道它的形状,你就不需要这个功能。我建议列出你试图用这个设计解决的更深层次的问题。 (是不是你有一个你想要接受的函数签名列表,而不是任何函数签名?)如果你需要 as cast 或 reflect 来使用它,你可能走错路了。
  • (Go 经常使用 interface{}reflect 来绕过它没有泛型的事实。Swift 有泛型,因此通常不需要这些工具。)

标签: swift go interface


【解决方案1】:

我对 Go 不是很熟悉,但我认为 Swift 等价物将是 AnyAnyObject 类型的参数。除了尝试将其转换为更具体的类型之外,您无法对此类参数做太多事情。

【讨论】:

    【解决方案2】:

    Go 的接口和 Swift 的协议完全不同:

    • Golang 的接口是“结构化的”(类似于 C++ 的"Concepts"),这意味着它们的身份是由它们的结构定义的。如果 go struct 具有接口所需的结构,它会隐式实现该接口。也就是说,该结构在任何地方都没有说“我信任S,并且我实现了接口I。”

    • Swift 的协议是“名义上的”,这意味着它们的身份由它们的名字定义。如果 Swift 结构满足协议的所有要求,则它不符合该协议,除非作出明确的 struct S: P { ... } 声明(该声明的主体甚至可以是空的,但仍然需要符合存在)。

    在 Swift 中与 interface{} 最接近的类似物是 Any。它是所有类型都符合的内置协议。它得到特殊处理,由编译器定义,并具有硬编码逻辑以使所有其他类型都符合它。您不会在任何地方看到明确声明的protocol Any {}struct S: Any {}AnyObject 类似,也有特殊处理。但没有其他 Swift 协议可以做到。它们的一致性需要明确。

    【讨论】:

      【解决方案3】:

      如果我没记错 Swift 的等价物是:

      protocol EmptyProtocol {
      }
      

      在 swift 接口中称为协议不要问我:D

      您是在尝试进行类型擦除还是什么?只是好奇...

      【讨论】:

      • 是的,但我想将一个空协议作为参数传递给 go..
      • 我不得不做一个快速的谷歌搜索,因为我没有在 golang 中编程。我注意到您也可以将接口传递给函数。那么,当里面的项目是任何类型时,使用空接口?我在 swift 中唯一能想到的是带有 associatedType 的协议,但这些协议不能被传递,并且只能作为类型的约束......我认为你正在寻找的东西在 swift 中并不存在,但也许其他人会证明这个理论是错误的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-01
      • 2013-06-16
      • 2016-12-13
      • 1970-01-01
      • 2020-03-28
      • 2016-07-03
      • 2010-10-20
      相关资源
      最近更新 更多