2015-12-09 3 views
2

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

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 
} 

Но что надеть на строку, отмеченную комментарием BUG?

ответ

4

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

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

+1

Удивительная, спасибо! – samuke