我正在尝试实现类似于 - 但不完全相同 - 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
}
}
以下陈述保证是真实的:
实现Handler
的类,必须指定实现HandlerValues
的枚举,否则将引发错误。
该枚举的名称将始终为MyEnum
(在此示例中)
任何实现HandlerValues
的枚举将始终在Handler
类中定义。 (类似于CodableKeys
中定义的Codable
。从技术上讲,这不能强制执行,但如果在其他任何地方定义,则会被忽略。)
我想做的是两件事之一:
HandlerValue
作为参数的函数内部,推断它包含类,或者...... Handler
作为参数的函数内部,能够枚举其HandlerValues
(就像采用Codable
的实现知道如何迭代其CodableKeys
enum。)首先,我的想法是使用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}}首先是一个枚举?)
那么如何获得这些信息?
答案 0 :(得分:0)
我想出了如何实现我所追求的目标。简而言之,我现在以纯粹的Swift方式使用解决方案#2。
Here's the link to the answer关于我的另一个问题。