是否可以从嵌套类型的实例中获取包含类型?
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
}
}
以下陈述保证为真:
实现Handler
的class,必须指定一个实现HandlerValues
的枚举,否则将出现错误被抛出。
该枚举的名称将始终为 MyEnum
(在此示例中)
任何实现 HandlerValues
的枚举都将始终在 Handler
class 中定义。 (类似于 CodableKeys
在 Codable
中定义。从技术上讲,这不能强制执行,但如果它在其他任何地方定义,它就会被忽略。)
我想做的是以下两件事之一:
- 在以
HandlerValue
作为参数的函数中,推断它包含 class,或者...
- 在一个以
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 方式工作。
关于我的另一个问题。
我正在尝试实现与 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
的class,必须指定一个实现HandlerValues
的枚举,否则将出现错误被抛出。该枚举的名称将始终为
MyEnum
(在此示例中)任何实现
HandlerValues
的枚举都将始终在Handler
class 中定义。 (类似于CodableKeys
在Codable
中定义。从技术上讲,这不能强制执行,但如果它在其他任何地方定义,它就会被忽略。)
我想做的是以下两件事之一:
- 在以
HandlerValue
作为参数的函数中,推断它包含 class,或者... - 在一个以
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 方式工作。