Как извлечь `rawValue` из` Any`, если значение равно `RawRepresentable` - PullRequest
1 голос
/ 02 апреля 2019

Я ищу что-то вроде:

func extractRawValue(fromPossibleRawRepresentable value: Any) -> Any? {
    return (value as? RawRepresentable)?.rawValue
}

Я не против, если извлеченный RawValue должен быть статическим типом ...

func extractRawValue<T: RawRepresentable, U>(fromPossibleRawRepresentable value: Any, expecting: U.Type) -> U? where T.RawValue == U {
    return (value as? T)?.rawValue
}

Контекст: Iхочу собирать в зеркале не сырые, а фактические значения.

let d = Mirror(reflecting: self).children.reduce(into: [String: String](), {
    guard let label = $1.label else {
        return
    }
    $0[label] = extractRawValue(fromPossibleRawRepresentable: $1.value)
}

1 Ответ

0 голосов
/ 05 апреля 2019

Проблема в том, что RawRepresentable имеет associatedtype, поэтому вы не можете присвоить Any ему.Вы также не можете использовать его как универсальный тип, потому что тогда вы должны будете использовать сам конкретный тип в сигнатуре функции, что противоречит цели.

Вы можете довольно легко обойти эти проблемы, используя:

protocol RawString {
    var rawValue: String { get }
}

Это позволит вам извлечь значения, используя:

func extractRawValue(value: Any) -> String? {
    return (value as? RawString)?.rawValue
}

Для любого типа, из которого вы хотите извлечь rawValue как String, просто добавьте к нему соответствие RawString, например

enum Foo: String, RawString {}

// or

struct StringContainer: RawString {
   var rawValue: String
}

Недостатками этого подхода является то, что вам необходимо явно пометить каждый тип, чтобы он соответствовал RawString, но, к сожалению, я не вижу другого пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...