2015-01-27 7 views
5

일반 버전의 NSCoding 구현을 만들고 새로운 버전의 응용 프로그램으로 인해 개체 유형이 변경되었을 때 디코딩에 문제가 있습니다.validateValue 메서드를 호출하는 방법

Swift에서 validateValue 메서드를 호출하는 데 문제가 있습니다. 함수 서명은 다음과 같습니다 참고로

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

는 애플의 문서는 여기에서 찾을 수 있습니다 : 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에 대한 호출이 올바른지 확인하십시오. 컴파일 오류가 계속 발생합니다. 어떻게 부를까요? EVReflection

업데이트 : toDictionary 기능에서 찾을 수 있습니다 난 그냥이 코드는 컴파일한다는 것을 발견 :

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

이 유형의 AnyObject이며 그 값을 의미? AutoreleasingUnsafeMutablePointer에 캐스팅 될 수 없습니다.

답변

1

newValue 필드는 앞에 &을 추가하여 포인터로 전달되어야했습니다. 게다가 let 대신에 var를 사용해야합니다. 최종 코드는 다음과 같습니다.

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) 
      } 
     } 
    } 
} 
관련 문제