2016-11-01 9 views
1

iOSとmacOSの間でデータをクロスプラットフォームで共有するアプリケーションを開発しています。私はモデルをファイルにシリアライズするためにNSCodingを使用しています。私のデータモデルの特定のプロパティはInt型です。以下は、iOSとMacOSの両方で実行されるコードのセクションです:iOSとmacOS間のInt値の比較

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

質問がされ、私はiCloud上のファイルへのiOS上でこの整数を保存し、ファイルを開いて、MacOSの上でデコードした場合になりますデータは同じままですか?私はIntがこれら2つのプラットフォーム上で異なって解釈されるという噂を聞いたことがある。私は文字列として自分の整数を格納し、整数にキャストすることも勧められました。誰かがこれが真実かどうかを確認できますか?

答えて

3

私が考えることができる唯一の問題は、32ビットと64ビットの環境で問題が発生する可能性があることです。 Intは2つの間の最大サイズを変更し、64ビットから32ビットになると奇妙な結果になることがあります。

これを防ぐには、特定のタイプのIntInt32またはInt64など)を使用します。これはすべての環境で適切に動作するはずです。コード内で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