2016-10-07 2 views
0

I Erweiterung der Cache-Klasse für NSData generische Typ erstellt haben (https://github.com/aschuch/AwesomeCache)Swift Erweiterung für Generic Typ Compilerfehler

Erste Methode funktioniert gut, aber setIntegerValue zeigen Compiler-Fehler: „Kann nicht aufrufen 'setObject' mit ein Argumentliste vom Typ '(NSData, forKey: String, abläuft: CacheExpiry)'“in Zeile: self.setObject (Daten, forKey: forKey, abläuft: abläuft)

extension Cache where T: NSData { 
    func integerForKey(key: String) -> Int? { 
     if let data = self.objectForKey(key), string = String(data: data, encoding: NSUTF8StringEncoding), intValue = Int(string) { 
      return intValue 
     } 
     return nil 
    } 

    func setIntegerValue(integerValue: Int, forKey: String, expires: CacheExpiry = .Never) { 
     let stringValue = String(integerValue) 
     if let data = stringValue.dataUsingEncoding(NSUTF8StringEncoding) { 
      self.setObject(data, forKey: forKey, expires: expires) 
     } 
    } 
} 

ich habe Test ohne Verlängerung geschaffen welche funktioniert perfekt:

let cache = try! Cache<NSData>(name: "MyCache") 
let string = "foo" 
if let data = string.dataUsingEncoding(NSUTF8StringEncoding) { 
    cache.setObject(data, forKey: "bar") 
} 

Also, ich verstehe nicht, was passiert ist? Kann mir jemand sagen - was ist los?

+0

'Erweiterung Cache wo T: NSData' - Ich dachte Swift erlaubt Protokolle nur in' Extension/Where' Typ Einschränkungen. Es wird nicht einmal mit 'NSData' funktionieren. – user28434

Antwort

0

Das Problem ist, dass data ist ein NSData, aber setObject nimmt ein T als seinen ersten Parameter. Keine NSData.

Es ist wahr, dass Sie diese Erweiterung für T:NSData definiert haben, aber das ist Swift egal.

+0

Ich nehme an, Sie könnten es kompilieren, indem Sie 'setObject (Daten als! T ...' schreiben, aber ich habe keine Ahnung, was zur Laufzeit passieren würde. :) Möglicherweise würde das Universum explodieren. – matt

+0

func integerForKey (key: String) ... hat code: wenn late data = self.objectForKey (key) - es gibt nicht 'T' zurück, sondern NSDada, also was ist der Unterschied für Swift, dass der Methodenparameter T sein sollte, aber Rückgabetyp ist NSData? – zyxman