2015-01-27 29 views
5

Ich versuche eine generische NSCoding-Implementierung durchzuführen und habe ein Problem mit der Decodierung, wenn sich der Objekttyp aufgrund einer neueren Version der App inzwischen geändert hat.So rufen Sie die validateValue-Methode auf

Ich habe ein Problem mit dem Aufruf der validateValue-Methode von Swift. Die Funktion Signatur ist:

func validateValue(_ ioValue: AutoreleasingUnsafeMutablePointer<AnyObject?>, forKey key: String, error outError: NSErrorPointer) -> Bool 

Als Referenz kann der Apple-Dokumentation finden Sie hier: NSCoding validateValue

Der Code, den ich erstellen möchten ist:

public class func decodeObjectWithCoder(theObject:NSObject, aDecoder: NSCoder) { 
     for (key, value) in toDictionary(theObject) { 
      if aDecoder.containsValueForKey(key) { 
       let newValue: AnyObject? = aDecoder.decodeObjectForKey(key) 
       NSLog("set key \(key) with value \(newValue)") 
       var error:NSError? 

       var y:Bool = theObject.validateValue(newValue, forKey: key, error: &error) 
       if y { 
        theObject.setValue(newValue, forKey: key) 
       } 
      } 
     } 
    } 

Ich kann nicht Der Aufruf von .validateValue ist korrekt. Ich bekomme immer Kompilierfehler. Wie soll ich es nennen?EVReflection

Update:: Die ToDictionary Funktion finden Sie unter Ich habe gerade herausgefunden, dass dieser Code nicht kompiliert:

 var ioValue: AutoreleasingUnsafeMutablePointer<AnyObject?> = nil 
     var y:Bool = theObject.validateValue(ioValue, forKey: key, error: nil) 

, welche Art ist von ANYOBJECT Dies würde bedeuten, dass der Wert? konnte nicht an AutoreleasingUnsafeMutablePointer übergeben werden

Antwort

1

Das Feld newValue musste als Zeiger übergeben werden, indem die & davor hinzugefügt wurde. Außerdem musst du var anstelle von let verwenden. Der endgültige Code lautet also:

public class func decodeObjectWithCoder(theObject:NSObject, aDecoder: NSCoder) { 
    for (key, value) in toDictionary(theObject) { 
     if aDecoder.containsValueForKey(key) { 
      var newValue: AnyObject? = aDecoder.decodeObjectForKey(key) 
      if theObject.validateValue(&newValue, forKey: key, error: nil) { 
       theObject.setValue(newValue, forKey: key) 
      } 
     } 
    } 
} 
Verwandte Themen