- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
让我们假设:
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!") }
但是如何判断这是不是一个基于 String
的枚举呢?
UPD: this tweet建议您可以从 Enum 中获取 rawValue
作为 Any。然后您可能可以检查 rawValue
是否为 String
。但是如何从Mirror
获取rawValue
呢?
最佳答案
好的,所以目前这基本上是开箱即用的,因为你不能 as?
-cast 到 RawRepresentable
和 Mirror
不为枚举提供 rawValue
。
我认为最好的办法是制定自己的协议(protocol)
,为基于String
的RawRepresentable
提供默认实现并手动符合所有枚举像这样:
假设这些是枚举:
enum E1: String { case one }
enum E2: String { case two }
enum E3: String { case three }
StringRawRepresentable
协议(protocol)和默认实现:
protocol StringRawRepresentable {
var stringRawValue: String { get }
}
extension StringRawRepresentable
where Self: RawRepresentable, Self.RawValue == String {
var stringRawValue: String { return rawValue }
}
使所有需要的现有枚举符合协议(protocol):
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 - if-let Any 到 RawRepresentable<String>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43666118/
我正在创建一个包装字典的自定义集合。该集合应该识别何时获得具有 string/int 类型的原始值的枚举,如果是这样,它将自动从中提取“rawValue”。 我的一个下标应该处理下标的键为 Strin
为了将 NSCoding 与 Swift 的枚举类型一起使用,我对 NSCoder 进行了扩展: extension NSCoder { func encodeEnum(value: Enum
我正在尝试编写一个基于字符串扩展枚举的扩展。我知道扩展所有枚举的方法是扩展 RawRepresentable,但我希望它仅限于字符串。 extension RawRepresentable where
在 Swift 书中,枚举的例子很好用 enum CompassPoint: String { case north, south, east, west } var northCom = C
我正在尝试为我的 FieldIdentifiable 协议(protocol)创建一个扩展,仅当实现它的枚举具有 Int 的 RawValue 时。唯一的问题是 return FieldIdItem(
我想使用在 Objective-C 和 Swift 中都可见但不符合协议(protocol) RawRepresentable 的枚举。 我试图让一个字符串枚举在 Objc 和 Swift 中都可见,
让我们假设: enum MyEnum: String { case value } let possibleEnum: Any = MyEnum.value if let str = stringFr
我试图使具有关联值的枚举符合 CaseIterable、RawRepresentable。当通过 rawValue 初始化时,我对关联值的一些默认值没问题。 enum GenresAssociated
我想要一个可以实例化几个不同对象的通用函数enum我通过提供枚举类型和 Int原始值(value)。这些enum s 也是 CustomStringConvertible . 我试过这个: func
我正在寻找编写一个将与各种测量结构一起使用的协议(protocol)。每个结构体都有自己的 Units 枚举,用于定义用于比较的单位类型: public enum TestUnits: Double
我这里有一个结构,当 Xcode 尝试编译它时它会生成错误 public struct GATToIPPermissions : OptionSet { public init(rawValu
我看到了这个答案How to enumerate an enum with String type? 现在我正在尝试创建将返回字符串数组的方法使用枚举的原始值。 所以我做到了: class func
我正在寻找类似的东西: func extractRawValue(fromPossibleRawRepresentable value: Any) -> Any? { return (valu
我正在尝试为 RawRepresentable 创建一个带有可选参数的通用可失败初始化程序,基本上是这个 https://www.natashatherobot.com/swift-failable-
将我的 Playground 代码更改为 Swift 3,Xcode 建议更改 enum Error: ErrorType { case NotFound } 到 enum Error: Er
我正在尝试编写一个函数,该函数接受任何可由 CustomStringConvertible 表示的 RawRepresentable 值。我试过这样写: enum MyEnum: String {
使用以下简化结构: class Property: Mappable { var path: String? override func mapping(map: Map) {
我有一个案例,我试图定义一个接受对象数组的函数,要求每个对象必须定义一个基于字符串的枚举,称为“命令”。 下面是一个示例,说明如果您使用关联类型,您将如何做到这一点: protocol Command
我已经声明了错误类型 enum UserServicesError: ErrorType { case UserNotLogged } 但是我得到一个错误 参数类型“UserServicesE
所以我有一个接收 Any 的函数,它通过反射检查 Any 是否是一个枚举: func extractRawValue(subject: Any) throws -> Any { let mir
我是一名优秀的程序员,十分优秀!