Хотя упомянутые ответы дают решение, я бы упомянул проблему самого подхода:
На этом этапе каждый новый регистр (ключ) должен быть добавлен в ваш оператор switch
с соответствующим значением, которое представляется нежелательным стандартным кодированием; Я предполагаю, что вы могли бы представить, как это будет выглядеть при наличии многих дел в перечислениях.
Поэтому я бы рекомендовал придерживаться более динамичного подхода вместо добавления значения каждого случая вручную в операторе switch
. Пример:
protocol Localizable {
var value: String { get }
}
extension RawRepresentable where Self: Localizable, Self.RawValue == String {
var value: String { return rawValue }
}
extension CustomStringConvertible where Self: RawRepresentable, Self.RawValue == String {
var description: String { return rawValue }
}
struct LocalizeKey {
enum Buttons: String, Localizable, CustomStringConvertible {
case remove = "Remove"
case add = "Add"
}
enum Messages: String, Localizable, CustomStringConvertible {
case success = "Success"
case failure = "Failure"
}
}
Мы применяем ту же логику для вашего кода с некоторыми улучшениями, облегчающими поддержку.
Исходя из этого, вы все еще можете реализовать свою функцию как:
func keyString(for type: Localizable) {
print(type)
}
Использование:
keyString(for: LocalizeKey.Buttons.add) // Add
keyString(for: LocalizeKey.Messages.success) // Success
ИМО, я считаю, что называть это так кажется более читабельным, простым, чем предлагаемый подход (keyString(for: .message(.failure))
).