2016-11-01 2 views
1

Я разрабатываю приложение, которое будет делиться кросс-платформой данных между iOS и macOS. Я использую NSCoding для сериализации моей модели в файл. Специфическое свойство в моей модели данных имеет тип Int. Ниже приведен фрагмент кода, который работает на оба прошивке и MacOS:Кодирование и декодирование 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) 
    } 
} 

Вопрос заключается в том, если я сохраню это число на прошивке в файл на ICloud, а затем открыть файл и декодировать в на MacOS выйдет данные остаются прежними? Я слышал слухи, что Int интерпретируются по-разному на этих двух платформах. Я даже рекомендовал хранить мои целые числа в виде строк, а затем отливать их в целое число. Может ли кто-нибудь подтвердить, верно это или нет?

ответ

3

Единственная проблема, о которой я могу думать, это то, что вы можете столкнуться с проблемами с 32-разрядными и 64-разрядными средами. Int изменит максимальный размер между двумя, и вы можете получить нечетные результаты, когда он идет от 64 бит до 32 бит.

Что вы можете сделать, чтобы защитить от этого, используется определенный тип Int, такой как Int32 или 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