是否可以从嵌套类型的实例中获取包含类型?

Is it possible to get the containing type from an instance of a nested type?

我正在尝试实现与 Swift4 使用的 Codable/CodableKeys 协议相似但不完全相同的东西。

给定以下代码:

protocol Handler{}
protocol HandlerValues{}

class SomeClass : Handler{

    enum MyEnum : String, HandlerValues{
        case first
        case second
    }
}

class SomeOtherClass : Handler{

    enum MyEnum : String, HandlerValues{
        case third
        case fourth
        case fifth
    }
}

以下陈述保证为真:

  1. 实现Handler的class,必须指定一个实现HandlerValues的枚举,否则将出现错误被抛出。

  2. 该枚举的名称将始终为 MyEnum(在此示例中)

  3. 任何实现 HandlerValues 的枚举都将始终在 Handler class 中定义。 (类似于 CodableKeysCodable 中定义。从技术上讲,这不能强制执行,但如果它在其他任何地方定义,它就会被忽略。)

我想做的是以下两件事之一:

  1. 在以 HandlerValue 作为参数的函数中,推断它包含 class,或者...
  2. 在一个以 Handler 作为参数的函数中,能够枚举它的 HandlerValues (就像采用 Codable 的实现如何知道如何迭代它的 CodableKeys枚举。)

首先,我的想法是使用 String(reflecting:),在 '.' 上拆分,去掉最后一个组件,reassemble/join 到一个字符串,然后根据它获取类型。它是从左到右三,但它会让我到达那里。

在第二种情况下,我试图以这样一种方式定义 Handler 以保证它将有一个可以枚举的 HandlerValues 枚举(同样,如 Codable知道它会有一个 CodableKeys 枚举。我只是不知道 Codable 是如何定义的。)

我试过了,当然不行...

protocol HandlerValues{}
protocol Handler{
    enum MyEnum : HandlerValues
}

更新

这似乎让我更接近...

protocol HandlerValues : RawRepresentable{}
protocol Handler{
    associatedtype MyEnum : HandlerValues
}

...但我仍然不知道如何实现上面的#2(即给定一个 Handler 实例,您如何枚举其 MyEnum 的值或者您如何甚至保证 MyEnum 首先是一个枚举?)

那么如何获取这些信息呢?

我想出了实现目标的方法。简而言之,我现在有了解决方法 #2,它以纯粹的 Swift 方式工作。

关于我的另一个问题。