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

Swift 是否可以从嵌套类型的实例获取包含类型?,swift,reflection,inner-classes,mirror,Swift,Reflection,Inner Classes,Mirror,我试图实现与Swift4使用的可编码/可编码密钥协议相似但不完全相同的功能 给定以下代码: protocol Handler{} protocol HandlerValues{} class SomeClass : Handler{ enum MyEnum : String, HandlerValues{ case first case second } } class SomeOtherClass : Handler{ enum

我试图实现与Swift4使用的可编码/可编码密钥协议相似但不完全相同的功能

给定以下代码:

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
    }
}
以下陈述保证属实:

实现Handler的类必须指定实现HandlerValues的枚举,否则将引发错误

在本例中,该枚举的名称将始终为MyEnum

任何实现HandlerValues的枚举都将始终在处理程序类中定义。类似于在可编码表中定义的可编码键。从技术上讲,这是无法强制执行的,但如果在其他任何地方定义了它,它就会被忽略

我想做的是两件事之一:

在以HandlerValue为参数的函数中,推断它包含类,或者。。。 在以处理程序为参数的函数中,能够枚举其HandlerValue,例如,采用Codable的实现知道如何在其CodableKeys枚举上迭代。 首先,我的想法是使用Stringreflecting:,在“.”上拆分,去掉最后一个组件,重新组装/连接到字符串,然后基于它获取类型。从左到右还剩三步,但这会让我到达那里

在第二种情况下,我试图以这样一种方式定义处理程序,以保证它将有一个HandlerValues枚举,可以再次枚举,就像Codable知道它将有一个CodableKeys枚举一样。我只是不知道Codable是怎么定义的

我试过了,但当然不行

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

这似乎让我离得更近了

protocol HandlerValues : RawRepresentable{}
protocol Handler{
    associatedtype MyEnum : HandlerValues
}
…但我仍然不知道如何实现上面的2,即给定一个处理程序实例,如何枚举其MyEnum的值,或者如何首先保证MyEnum是一个枚举


那么怎样才能获得这些信息呢?

我想出了如何实现我所追求的目标。简而言之,我现在有了解决方案方法2,它以一种纯粹快速的方式工作


关于我的另一个问题。

你必须明确地参考MyClass,这就违背了问题的全部要点。您应该能够从someValue获取类型信息。我试图弄清楚如何遍历层次结构。Swift不公开嵌套类型与其容器之间的任何关系。你到底想实现什么?除了嵌套类型所具有的名称空间效应外,MyClass和MyClass.MyEnum是完全不相关的类型。当然它们是独立的类型,但MyClass是一个类型,MyEnum是一个嵌套类型,因此,如果不将MyClass指定为其名称的一部分,你就不能定义MyEnum。你认为“MyClass.MyEnum”来自哪里?换句话说,当您调用StringDescription时:使用MyEnum,您只需要得到“MyEnum”。但是当你调用StringReflection时,你会得到“MyClass.MyEnum”。在内部,它必须知道层次结构是什么,以便构建该路径。这就是我想要的。