Swift 如果有任何可代表性<;字符串>;

Swift 如果有任何可代表性<;字符串>;,swift,generics,swift-protocols,Swift,Generics,Swift Protocols,让我们假设: enum MyEnum: String { case value } let possibleEnum: Any = MyEnum.value if let str = stringFromPossibleEnum(possibleEnum: possibleEnum) 在不知道枚举类型名称的情况下实现stringFromPossibleEnum的最佳选择是什么 func stringFromPossibleEnum(possibleEnum: Any) -> String

让我们假设:

enum MyEnum: String { case value }
let possibleEnum: Any = MyEnum.value
if let str = stringFromPossibleEnum(possibleEnum: possibleEnum)
在不知道枚举类型名称的情况下实现
stringFromPossibleEnum
的最佳选择是什么

func stringFromPossibleEnum(possibleEnum: Any) -> String? {
//    how should this be implemented without knowing enum type name?
}
UPD:好了,情况越来越好,有了这个,我可以判断
possibleEnum
是否是一个枚举:

if Mirror(reflecting: possibleEnum).displayStyle == .enum { print("yes!") }
但如何判断这是否是基于
字符串的枚举


UPD:建议您可以从Enum获取任何
rawValue
。然后,您可能可以检查
rawValue
是否为
String
。但是如何从镜像中获取原始值呢

不确定您在这里真正想要实现什么,但这里是:

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))
enum MyEnum:String{
案例A
案例B
案例C
}
func stringFromEnum(u值:T)->字符串
其中T.RawValue==字符串{
返回值.rawValue
}
打印(stringFromEnum(MyEnum.A))
打印(stringFromEnum(MyEnum.B))
打印(stringFromEnum(MyEnum.C))

好的,所以这在当前的开箱即用的情况下基本上是不可行的,因为您不能将
转换为
rawrrepresentable
,并且
Mirror
不为枚举提供
rawValue

我认为最好的办法是制定自己的
协议
,为基于
字符串
RawRepresentable
提供默认实现,并手动使所有枚举一致,如下所示:

假设这些是枚举:

enum E1: String { case one }
enum E2: String { case two }
enum E3: String { case three }
StringRawRepresentable
协议和默认实现:

protocol StringRawRepresentable {
    var stringRawValue: String { get }
}

extension StringRawRepresentable 
where Self: RawRepresentable, Self.RawValue == String {
    var stringRawValue: String { return rawValue }
}
使所有需要的现有枚举符合协议:

extension E1: StringRawRepresentable {}
extension E2: StringRawRepresentable {}
extension E3: StringRawRepresentable {}
现在我们可以转换为
StringRawRepresentable

func stringFromPossibleEnum(possibleEnum: Any) -> String? {
    if let e = possibleEnum as? StringRawRepresentable { return e.stringRawValue }
    return nil
}

stringFromPossibleEnum(possibleEnum: E2.two as Any)

我觉得这里有问题。你到底想做什么?我想更好地了解
swift
的这一面。
var a:有吗?=str.rawValue
应该也能正常工作,但我不确定这是否是您想要的,因为您没有告诉我们您真正想要做什么。让我重新回答这个问题,以便更清楚地了解
a
只是一个以字符串为背景的枚举,而不是具体的枚举,这是不可能的(AFAIK)获取支持的值(您只知道它是
rawrrepresentable
,但由于协议关联类型的原因,您不能将某个内容声明为
rawrrepresentable
)。正如@OzgurVatansever所说,听起来你已经开始走上了一条错误的道路。嗨,Alex,谢谢你的回复。如果您可以从枚举中获取
stringfromnum
以接受
Any
并返回
String
,如果传递的值是可表示的字符串-这就是我感兴趣的问题,这个答案的问题是您应该扩展每个枚举。这是胡闹。@Aleksandr这是真的。让我知道,如果你有一个解决方案,涉及较少的猴子工作,然后这一个。