如何调用validateValue方法

时间:2015-01-27 22:54:25

标签: swift nscoding

我正在尝试制作通用的NSCoding实现,并且由于更新版本的应用程序,当对象的类型在平均时间内发生了变化时,解码时出现问题。

我从Swift调用validateValue方法时遇到问题。功能签名是:

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

作为参考,可以在此处找到Apple文档:NSCoding validateValue

我想要创建的代码是:

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)
                }
            }
        }
    }

我无法正确调用.validateValue。我不断收到编译错误。我该怎么称呼它。 toDictionary函数可在以下位置找到:EVReflection

更新:我刚刚发现此代码已编译:

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

这意味着AnyObject类型的值?无法转换为AutoreleasingUnsafeMutablePointer

1 个答案:

答案 0 :(得分:1)

newValue字段必须通过添加&amp;作为指针传递。在它面前。除此之外,你必须使用var而不是let。所以最终的代码是:

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)
            }
        }
    }
}