首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果-让任何到RawRepresentable<String>

如果-让任何到RawRepresentable<String>
EN

Stack Overflow用户
提问于 2017-04-27 19:10:37
回答 2查看 1.6K关注 0票数 3

让我们假设如下:

代码语言:javascript
复制
enum MyEnum: String { case value }
let possibleEnum: Any = MyEnum.value
if let str = stringFromPossibleEnum(possibleEnum: possibleEnum)

在不知道枚举类型名称的情况下实现stringFromPossibleEnum的最佳选择是什么?

代码语言:javascript
复制
func stringFromPossibleEnum(possibleEnum: Any) -> String? {
//    how should this be implemented without knowing enum type name?
}

UPD:,好的,这样我可以判断possibleEnum是否是一个枚举:

代码语言:javascript
复制
if Mirror(reflecting: possibleEnum).displayStyle == .enum { print("yes!") }

但是如何判断这是否是一个String-based枚举呢?

UPD: 这条推特建议您可以从Enum获得rawValue。然后,您可能可以检查该rawValue是否为String。但是如何从rawValue获得Mirror

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-09 11:09:06

好的,这基本上是不可行的,因为你不能as?-cast to RawRepresentable,而Mirror不为枚举提供rawValue

我认为最好的选择是创建自己的protocol,为String-based RawRepresentable提供默认的实现,并手动遵守所有枚举,如下所示:

假设这些是枚举:

代码语言:javascript
复制
enum E1: String { case one }
enum E2: String { case two }
enum E3: String { case three }

StringRawRepresentable协议和默认实现:

代码语言:javascript
复制
protocol StringRawRepresentable {
    var stringRawValue: String { get }
}

extension StringRawRepresentable 
where Self: RawRepresentable, Self.RawValue == String {
    var stringRawValue: String { return rawValue }
}

使所有需要的现有枚举符合议定书:

代码语言:javascript
复制
extension E1: StringRawRepresentable {}
extension E2: StringRawRepresentable {}
extension E3: StringRawRepresentable {}

现在我们可以转换为StringRawRepresentable

代码语言:javascript
复制
func stringFromPossibleEnum(possibleEnum: Any) -> String? {
    if let e = possibleEnum as? StringRawRepresentable { return e.stringRawValue }
    return nil
}

stringFromPossibleEnum(possibleEnum: E2.two as Any)
票数 5
EN

Stack Overflow用户

发布于 2017-04-27 20:53:42

不知道你到底在努力实现什么,但这里是:

代码语言:javascript
复制
enum MyEnum: String {
    case A
    case B
    case C
}

func stringFromEnum<T: RawRepresentable>(_ value: T) -> String
    where T.RawValue == String {
    return value.rawValue
}

print(stringFromEnum(MyEnum.A))
print(stringFromEnum(MyEnum.B))
print(stringFromEnum(MyEnum.C))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43666118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档