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这是真的。让我知道,如果你有一个解决方案,涉及较少的猴子工作,然后这一个。