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

时间:2017-12-13 01:21:13

标签: swift reflection inner-classes mirror

我正在尝试实现类似于 - 但不完全相同 - 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的类,必须指定实现HandlerValues的枚举,否则将引发错误。

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

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

  4. 我想做的是两件事之一:

    1. 在以HandlerValue作为参数的函数内部,推断它包含类,或者......
    2. 在以Handler作为参数的函数内部,能够枚举其HandlerValues(就像采用Codable的实现知道如何迭代其CodableKeys enum。)
    3. 首先,我的想法是使用String(reflecting:),拆分'。',删掉最后一个组件,重新组合/连接到一个字符串,然后根据它获取类型。它是三向左右,但它会让我在那里。

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

      我试过这个,但当然这不起作用......

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

      更新

      这似乎让我更接近......

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

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

      那么如何获得这些信息?

1 个答案:

答案 0 :(得分:0)

我想出了如何实现我所追求的目标。简而言之,我现在以纯粹的Swift方式使用解决方案#2。

Here's the link to the answer关于我的另一个问题。