Dan*_*e P 3 generics swift swift-protocols
让我们假设:
enum MyEnum: String { case value }
let possibleEnum: Any = MyEnum.value
if let str = stringFromPossibleEnum(possibleEnum: possibleEnum)
Run Code Online (Sandbox Code Playgroud)
在stringFromPossibleEnum
不知道枚举类型名称的情况下实现的最佳选择是什么?
func stringFromPossibleEnum(possibleEnum: Any) -> String? {
// how should this be implemented without knowing enum type name?
}
Run Code Online (Sandbox Code Playgroud)
UPD:好的,越来越好,有了这个我可以判断是否possibleEnum
是一个枚举:
if Mirror(reflecting: possibleEnum).displayStyle == .enum { print("yes!") }
Run Code Online (Sandbox Code Playgroud)
但是如何判断这是否是String
基于枚举的?
UPD: 这条推文表明你可以rawValue
从 Enum 中获得Any 。然后你可以检查它是否rawValue
是String
. 但如何rawValue
从Mirror
?
好的,所以目前这基本上是as?
不可行的,因为你不能-cast to RawRepresentable
,并且Mirror
不提供rawValue
枚举。
我想说最好的办法是创建自己的protocol
,为String
-based提供默认实现RawRepresentable
并像这样手动符合所有枚举:
假设这些是枚举:
enum E1: String { case one }
enum E2: String { case two }
enum E3: String { case three }
Run Code Online (Sandbox Code Playgroud)
StringRawRepresentable
协议和默认实现:
protocol StringRawRepresentable {
var stringRawValue: String { get }
}
extension StringRawRepresentable
where Self: RawRepresentable, Self.RawValue == String {
var stringRawValue: String { return rawValue }
}
Run Code Online (Sandbox Code Playgroud)
使所有需要的现有枚举符合协议:
extension E1: StringRawRepresentable {}
extension E2: StringRawRepresentable {}
extension E3: StringRawRepresentable {}
Run Code Online (Sandbox Code Playgroud)
现在我们可以投射到StringRawRepresentable
:
func stringFromPossibleEnum(possibleEnum: Any) -> String? {
if let e = possibleEnum as? StringRawRepresentable { return e.stringRawValue }
return nil
}
stringFromPossibleEnum(possibleEnum: E2.two as Any)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1383 次 |
最近记录: |