Универсальный геттер элементов для быстрого словаря


Скажем, у меня есть Dictionary<String, String>, для которого я хотел бы иметь удобные геттеры для типов, реализующихStringLiteralConvertible .

let items = ["Key 1": "Value 1", "Key 2": "Value 2"]

func get<T: StringLiteralConvertible>(key: String, _ defaultValue: T) -> T {
    if let value = items[key] {
        return T(stringLiteral: value)  // BUG
    }

    return defaultValue
}

Но что поставить на строку, помеченную комментарием к ошибке?

1 2

1 ответ:

Эта строка была фактически правильной, но строка выше должна быть более конкретной относительно того, какое значение типа будет. Попробуйте:

func get<T: StringLiteralConvertible>(key: String, _ defaultValue: T) -> T {
    if let value = items[key] as? T.StringLiteralType {
        return T(stringLiteral: value)
    }

    return defaultValue
}
PS: вы, вероятно, также захотите передать items в качестве параметра