【问题标题】:Swift work around to make `AnyObject.Type` conform to `Equatable`?Swift 解决方法使 `AnyObject.Type` 符合 `Equatable`?
【发布时间】:2017-10-15 20:01:10
【问题描述】:

我想让AnyClass(又名AnyObject.Type)符合Equatable,这样当我有一个包含AnyClass元素(Array<AnyClass>)的数组时,我可以调用remove(Element:),但这需要Element 符合Equatable

【问题讨论】:

  • stackoverflow.com/questions/24938948/…(实际上可能是重复的)。
  • @rmaddy 不,这是一个特定于编译器不允许对AnyClass 进行扩展的问题,因此,AnyClass 不可能符合Equatable 为在您提供的线程中使用
  • 在您花费更多精力来完成之前,请考虑您是否可以找到受影响类的共同点,例如协议。这种 AnyClass / AnyObject 假泛型 比找到共同点还要糟糕。
  • 比较Make a Swift dictionary where the key is “Type”?——你可以为此构建一个包装器类型(或者只使用.filter {$0 != someMetatype})。尽管如此,我还是想知道[AnyClass] 的使用——你到底想完成什么?
  • @Hamish 我将一组唯一键映射到一组与这些键相关的类。例如:["public.php" : [CodeEditor.self, TextEditor.self, WebViewer.self]].

标签: swift comparable equatable


【解决方案1】:

我实际上不认为您尝试实现的目标是可能的,或者您是否应该尝试以这种方式做到这一点。

类通常代表现实世界的对象,无论是汽车、视图还是完全不同的东西。所以很难说我创建的任何自定义 I 类与我创建的其他自定义类相同。

Swift 只是不知道如何比较它们,是什么让它们相同。

在这里实现您想要的最简单的方法是定义一个自定义协议/接口,该协议/接口代表您将在此应用程序中使用的类的通用版本,然后确保每个都符合该标准并且也是平等的。然后你应该能够做类似的事情:

var objs = Array<MyAppClassesProtocol>() 

也可以使用remove(element:)

【讨论】:

    【解决方案2】:

    从 Swift 3 开始,您可以使用 AnyHashable 代替 AnyObject。它表示任何符合Equatable 协议的值。

    而不是

    var array:[AnyObject] = []
    

    随便写

    var array:[AnyHashable] = []
    

    【讨论】:

      猜你喜欢
      • 2016-09-29
      • 1970-01-01
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      • 2014-08-25
      • 2022-08-02
      • 2020-12-04
      相关资源
      最近更新 更多