2016-11-02 5 views
2

Erforderliche Erweiterung für Dictionary als Textschlüsselwert erhalten, wenn vorhanden.In Swift Fehler erhalten Undeutlicher Verweis auf Member 'tiefgestellt'

unter Code implementiert und es wird erfolgreich kompiliert:

extension Dictionary where Key: ExpressibleByStringLiteral, Value: AnyObject { 
    func getValueForKeyPath(keyValue: String) -> String { 
     return ((self["item_qty"] as? Dictionary<String, String>) ?? ["": ""])?["text"] ?? "" 
    } 
} 

Aber wenn ich es tat in Verfahren Kleingeld immer Fehler wie:

"Mehrdeutige Bezug auf Mitglieder Index '"

extension Dictionary where Key: ExpressibleByStringLiteral, Value: AnyObject { 
    func getValueForKeyPath(keyValue: String) -> String { 
     return ((self[keyValue] as? Dictionary<String, String>) ?? ["": ""])?["text"] ?? "" 
    } 
} 

Bitte korrigieren Sie mich, wenn ich etwas falsch mache sie e.

Antwort

5

versuchen, keyValue zu Key zu werfen. Zum Beispiel:

extension Dictionary where Key: ExpressibleByStringLiteral, Value: AnyObject { 
    func getValueForKeyPath(keyValue : String) -> String{ 
     return ((self[keyValue as! Key] as? Dictionary<String,String>) ?? ["":""])?["text"] ?? "" 
    } 
} 
1

Während die Antwort von @Hoa kompiliert, wird es unter Umständen zum Absturz bringen (das heißt, wenn Dictionary.Key ist kein String). Eine bessere Lösung könnte die Verwendung einer der init(...) Methoden aus dem ExpressibleByStringLiteral Protokoll sein.

Beachten Sie die zusätzliche generische Integritätsbedingung:Key.StringLiteralType == String. Dies ermöglicht uns, keyValue zu verwenden, um ein Key Objekt zu instanziieren und dann das in self[key] zu verwenden.
Ich denke, wir können davon ausgehen, dass alle verwendeten Strings String sind, also sollte das nichts beeinflussen.

extension Dictionary where Key: ExpressibleByStringLiteral, 
    Key.StringLiteralType == String, 
    Value: AnyObject { 

    func getValueForKeyPath(keyValue: String) -> String { 
    let key = Key(stringLiteral: keyValue) // <-- this is key 

    return ((self[key] as? Dictionary<String, String>) ?? ["": ""])?["text"] ?? "" 
    } 
} 

Als Randbemerkung, könnte es sich lohnen, zu machen, dass die Rückkehr Aussage ein wenig klarer und einfacher zu debuggen:

extension Dictionary where Key: ExpressibleByStringLiteral, 
    Key.StringLiteralType == String, 
    Value: AnyObject { 

    func getValueForKeyPath(keyValue: String) -> String { 
    let key = Key(stringLiteral: keyValue) 

    guard let dict = self[key] as? Dictionary<String, String>, 
     let text = dict["text"] 
     else { 
     return "" 
    } 

    return text 
    } 
} 
Verwandte Themen