2015-02-28 4 views
1

Я пытаюсь расширить словарь, но не могу ссылаться на себя с помощью ключа. Я в замешательстве, почему это так.Ссылка на self в расширении словаря

extension Dictionary { 
    func foo() { 
     var result = self["key"] 
    } 
} 

Я получаю эту ошибку: Тип «DictionaryIndex» не соответствует протоколу «StringLiteralConvertible»

Если у кого есть какие-либо понять, будет понятно.

+1

Это не скомпилируется, потому что ключ словаря является общим типом и не обязательно должен содержать строку. И вы (в настоящее время) не можете определить метод расширения, который ограничен определенными значениями типового заполнителя, сравните http://stackoverflow.com/questions/24938948/array-extension-to-remove-object-by-value для соответствующего проблема для массива. –

ответ

10

DictionaryGeneric struct. Он является общим для его Key и Value. Таким образом, в вашем расширении вы должны использовать Key в качестве типа словарных ключей и Value как тип значений словаря.

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

Вот пример:

extension Dictionary { 
    func ext(key: Key) { 
     if let value = self[key] { 
      // use your value 
      println("Key is present") 
     } else { 
      println("No value for key") 
     } 
    } 
} 

let dic = ["A": 20] 
dic.ext("A") 
dic.ext("B") 

Вот как вы можете сделать что-то подобное ... это могло бы сделать более ясным, почему ваш тест не работает:

extension Dictionary { 
    var foo: String? { 
     if let key = "key" as? Key { 
      return self[key] as? String 
     } 
     return nil 
    } 
} 
let dic1 = ["A": "an A", "key": "the value"] 
dic1.foo // "the value" as optional 
dic.foo // nil since dic value type is Int 

Поскольку Dictionary является generic struct, вы можете пересмотреть его, как если бы это конкретный тип бетон.

+0

Большое спасибо! Когда вы упоминаете конкретный тип, ссылаетесь ли вы на объект или используете общий? –

+0

@MatthewChung ups ... _reconsider_ Я имел в виду, не стоит этого делать. Расширение типа _generic_ с логикой, специфичной только для одного конкретного конкретного случая конкретного типа, может вызвать много путаницы в вашей базе кода. Нетрудно определить ваш конкретный словарь '[String: String]'. Просто назовите структуру, содержащую 'var' типа' [String: String] 'и определите' subscript (key: String) -> String? ', Чтобы просто вернуть или установить внутренний var. Таким образом, в вашем коде не будет путаницы о странном расширении 'Dictionary', которое работает только в случае' [String: String] '. –

+0

Мне нравится ваша точка. Однако я использовал этот словарь для сериализации в json. Есть ли у вас предложение по уменьшению путаницы, позволяя объекту сериализоваться json? –

Смежные вопросы