2016-11-24 9 views
2

NSCoder에있는 decodeDouble은 선택적 값이 아닌 값을 반환하지만 값이 인코딩되기 전에 값이 0인지 여부를 확인하고자합니다. 값이NSCoder decodeDouble 값의 선택적 값

를 인코딩하기 전에 실제로 0 또는 nil인지 내가 식별 할 수없는 것 같다 있도록

var optionalDouble: Double? = nil 

func encode(with aCoder: NSCoder) { 
    if let optionalDouble { 
     aCoder.encode(optionalDouble, forKey: "myOptionalDouble") 
    } 
} 

convenience required init?(coder aDecoder: NSCoder) { 
    optionalDouble = aDecoder.decodeDouble(forKey: "myOptionalDouble") 
    // here optionalDouble is never nil anymore 
} 

것은 그래서 값이 설정되지 않았습니다 경우 이중 반환 0을 디코딩 :

내 시나리오입니다

인코딩 전에 double이 0인지 확인하는 방법이 있습니까?

+0

당신에게 'NSNumber? '로 변환하여 encodeObject로 저장하고'decodeDouble' 대신'decodeObject' 사용 –

+0

'nil '값으로 인코딩 된 값과 키에 존재하지 않는 값을 구별 할 수 있어야합니까 ? – Hamish

+0

[이 답변] (http://stackoverflow.com/questions/39891190/how-do-i-decode-a-double-using-nscoder-nsobject-and-swift-3-for-ios/39895068#39895068)) 귀하의 사건에 유용합니까? –

답변

5

해결 방법은 인코딩 할 때 Double 대신 NSNumber를 사용하고 decodeObject를 사용하여 double 값 (있는 경우)을 얻는 것입니다. 예를 @Hamish에서 제안으로

class A: NSCoding { 
    var optionalDouble: Double? = nil 

    @objc func encodeWithCoder(aCoder: NSCoder) { 
     if let optionalDouble = optionalDouble { 
      aCoder.encodeObject(NSNumber(double: optionalDouble), forKey: "myOptionalDouble") 
     } 
    } 

    @objc required init?(coder aDecoder: NSCoder) { 
     if let decodedDoubleNumber = aDecoder.decodeObjectForKey("myOptionalDouble") as? NSNumber { 
      self.optionalDouble = decodedDoubleNumber.doubleValue 
     } else { 
      self.optionalDouble = nil 
     } 
    } 
} 

를 들어, 여기 스위프트 3의 버전은 우리가 일을 NSEncoding 만들기 위해 NSObject의에 클래스를 상속해야한다는주의입니다 (Got Unrecognized selector -replacementObjectForKeyedArchiver: crash when implementing NSCoding in Swift)

class A: NSObject, NSCoding { 
    var optionalDouble: Double? = nil 

    func encode(with aCoder: NSCoder) { 
     if let optionalDouble = optionalDouble { 
      aCoder.encode(optionalDouble, forKey: "myOptionalDouble") 
     } 
    } 

    override init() { 
     super.init() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     optionalDouble = aDecoder.decodeObject(forKey: "myOptionalDouble") as? Double 
    } 
} 
+4

Swift 3에서 명시 적으로 'NSNumber'를 거칠 필요가 없습니다. 단지'aCoder.encode (optionalDouble, forKey : "myOptionalDouble")''OptionalDouble'이 nil이 아닌 경우에는'Double'을 NSNumber에 연결합니다. '그냥? '라고 말할 수 있습니다. 디코드에서 '더블'. – Hamish

+0

의견을 보내 주셔서 감사합니다. –