投射到协议并使用价值?

Casting to protocol and using value?

基本上问题是代码的 RawRepresentable 部分,我需要能够获取它的值,但是因为我需要转换为协议,所以它不允许我使用 rawValue。有什么解决方法吗?

public protocol Serializable {
    func dictionary() -> [String: Any]
}

extension Serializable {
    func dictionary() -> [String: Any] {
        var result = [String: Any]()
        let mirror = Mirror(reflecting: self)

        for child in mirror.children {
            guard let label = child.label else { continue }

            switch child.value {
            case let serializable as Serializable:
                result[label] = serializable.dictionary()

            // Compile error here
            case let rawRepresentable as RawRepresentable:
                result[label] = rawRepresentable.rawValue

            default:
                result[label] = child.value
            }
        }

        return result
    }
}

我认为这归结为尝试在枚举之外使用关联类型的问题。

我是这样修复的:

public protocol Serializable {
    func dictionary() -> [String: Any]
}

extension Serializable {
    func dictionary() -> [String: Any] {
        var result = [String: Any]()
        let mirror = Mirror(reflecting: self)

        for child in mirror.children {
            guard let label = child.label else { continue }

            switch child.value {
            case let serializable as Serializable:
                result[label] = serializable.dictionary()

            case let rawRepresentable as RawRepresentable:
                let value = rawRepresentable.getValueAsAny()
                result[label] = value

            default:
                result[label] = child.value
            }
        }

        return result
    }
}

extension RawRepresentable {
    func getValueAsAny() -> Any {
        return rawValue as Any
    }
}