2016-11-01 6 views
1

iOS와 macOS 간의 데이터 크로스 플랫폼을 공유하는 앱을 개발 중입니다. 내 모델을 파일에 직렬화하기 위해 NSCoding을 사용하고 있습니다. 내 데이터 모델의 특정 속성은 Int 유형입니다. 다음은 iOS 및 맥 OS 모두에서 실행되는 코드의 섹션은 다음과 같습니다인코딩 및 디코딩 Int iOS와 macOS 사이의 값

class MyDataModel: NSObject, NSCoding { 
    struct Keys { 
     static let myNumber = "myNumber" 
    } 

    var myNumber: Int = 0 

    required init(coder aCoder: NSCoder) { 
     super.init() 
     myNumber = aDecoder.decodeInteger(PropertyKey.nameKey) 
    } 

    fun encode(with aCoder: NSCoder) { 
     aCoder.encodeInteger(myNumber, forKey: PropertyKey.ratingKey) 
    } 
} 

질문입니다 내가 아이 클라우드에있는 파일에 iOS에서이 정수를 저장 한 다음 파일을 열고 맥 OS에서의 디코딩하면됩니다 데이터는 동일하게 유지됩니까? Int이이 두 플랫폼에서 다르게 해석된다는 소문을 들었습니다. 내 정수를 문자열로 저장 한 다음 정수로 변환하는 것이 좋습니다. 누군가가 이것이 사실인지 아닌지를 확인할 수 있습니까?

답변

3

제가 생각할 수있는 유일한 문제는 32 비트 대 64 비트 환경에서 문제가 발생할 수 있다는 것입니다. Int은 둘 사이의 최대 크기를 변경하며 64 비트에서 32 비트로 바뀌면 이상한 결과가 발생할 수 있습니다.

이 문제를 방지하려면 또는 Int64과 같은 특정 유형의 Int을 사용하십시오. 이것은 모든 환경에서 제대로 작동해야합니다. 그런 다음 코드에서 Int으로 캐스팅하여 오버플로를 적절히 처리 할 수 ​​있습니다.

예 :

import Foundation 

enum PropertyKey: String { 
    case numberKey 
} 

class MyDataModel: NSObject, NSCoding { 
    var myNumber: Int64 = 0 // Explicitly provide integer width 

    required convenience init?(coder aCoder: NSCoder) { 
    guard let myNumber = aCoder.decodeInt64(forKey: PropertyKey.numberKey.rawValue) as Int64? else { 
     return nil 
    } 
    self.init() 
    self.myNumber = myNumber 
    } 

    func encode(with aCoder: NSCoder) { 
    aCoder.encode(myNumber, forKey: PropertyKey.numberKey.rawValue) 
    } 
} 
+0

멋진 대답. 이것은 32 비트 대 64 비트를 가진 장치 때문에 발생합니다. – loyalpenguin