Как сохранить и получить переменную с пользовательским типом - PullRequest
0 голосов
/ 24 мая 2019

У меня есть переменная identity с типом ETIdentity , которую мне нужно сохранить в ViewController1 и извлечь из ViewController2,

ViewController1

//Variables
var activationCodeFromCore, serialNumberFromCore, entityNameFromCore, deviceIdFromCore, registrationCodeFromCore, entityFromCore: String?
    var activationCode, serialNumber, entityName, deviceId, registrationCode, entity: String?
    var counter: Int = 0
var storedIdentity: ETIdentity?

Ниже хранится сохраненный идентификатор , который мне нужно сохранить

let storedIdentity = BridgeSDKUtils.performClassicActivation("26586-05858", withActivationCode: "8998-6857-1357-1870", "entidad0");
        GlobalIdentity.identity = storedIdentity;
func softTokenDataService() {

        let storedIdentity = BridgeSDKUtils.performClassicActivation("26586-05858", withActivationCode: "8998-6857-1357-1870", "entidad0");
        GlobalIdentity.identity = storedIdentity;

        self.activationCode = "8998-6857-1357-1870"
        self.serialNumber = "26586-05858"
        self.entityName = "entityData\(counter)"
        self.deviceId = "\(String(describing: storedIdentity?.deviceId))"
        self.registrationCode = "\(String(describing: storedIdentity?.registrationCode))"
        self.entity = "\(storedIdentity!)"
    }

...

func getEntityCore()
    {
        //Variables that are going to be stored
        self.activationCodeFromCore = activationCode
        self.serialNumberFromCore = serialNumber
        self.entityNameFromCore = entityName
        self.deviceIdFromCore = deviceId
        self.registrationCodeFromCore = registrationCode
        self.entityFromCore = storedIdentity
    }

...

//SecureStorage Function
func saveEntityToCoreData()-> Bool {

        self.softTokenDataService()

        var SavedItem:Bool = true

        var arr : [[String: Any]] = [[
            "activationCode": self.activationCodeFromCore,
            "serialNumber": self.serialNumberFromCore,
            "entityName": self.entityNameFromCore,
            "deviceId": self.deviceIdFromCore,
            "registrationCode": self.registrationCodeFromCore,
            "entity": self.entityFromCore]]

        let jsonData = try! JSONSerialization.data(withJSONObject: arr, options: [.prettyPrinted])
        let json = String(data: jsonData, encoding: String.Encoding.utf8)!

        if self.saveRutSwitchOn
        {
            SecureData.save(key: "entityData0)", data: json.data(using: .utf8)!)
        }
        SavedItem = self.saveRutSwitchOn

        return SavedItem
    }

ViewController2

struct Person {
    var activationCode: String
    var serialNumber: String
    var entityName: String
    var deviceId: String
    var registrationCode: String
    var entity: String
}

struct EntityModel: Codable {
    let activationCode, serialNumber, entityName, deviceId, registrationCode, entity: String?
}

if let loadedData = SecureData.load(key: "entityData0") {
            do {
                let decoder = JSONDecoder()
                decoder.keyDecodingStrategy = .convertFromSnakeCase
                let entityData = try decoder.decode([EntityModel].self, from: loadedData)
                entityData.forEach { (EntityModel) in

//Here I Imagine something like this
//var identity: ETIdentity?
//identity = EntityModel.entity
////Here I have the identity, so I can manipulate it like needed, because is from type ETIdentity I can access its methods.
//identity?.getOTP(Date())

                }
            } catch {
                print(error)
            }
        }

Справочные данные:

GlobalIdentity.swift

struct GlobalIdentity{

    static var identity : ETIdentity?

}

ETIdentity.h

@interface ETIdentity : NSObject<NSCoding> {
@private
-(NSString*)getOTP:(NSDate*)time;
@end

EDIT Проблема в том, что переменная entity (где мне нужно вызывать ее параметры в ViewController2) не является String, поэтому она вылетает, она не работает. Я также попытался поместить идентификатор переменной с нужным мне типом var identity: ETIdentity?, но ETIdentity отсутствует в протоколе с Codable (для работы со структурой, чтобы я мог вызывать их в ViewController2)

1 Ответ

0 голосов
/ 24 мая 2019

Я прочитал ваш вопрос и обнаружил, что вы упускаете основную вещь: ваша сущность кажется другой моделью, такой как словарь или какой-то другой тип, если это словарь, тогда сделайте это. В настоящее время ваш SecureData.load(key: "entityData0") содержит все данные, которые возвращают массив моделей сущностей, а ваш объект Data loadedData должен содержать entity объект. Почему бы вам не попытаться реализовать Codable для вашего entity, как это.

struct SortedArryModel: Codable {
var sorterarrkey: String? // if your array contain strings
}

И используйте это SortedArryModel в своем EntityModel

после этого вы можете получить свой массив как [ключ: строка], просто конвертируйте эту строку в массив. Предложение: в вашем случае лучше использовать JsonSerialization вместо кодируемого, если вы все еще хотите применить кодируемый, тогда ваши элементы должны соответствовать протоколу кодирования. Как я упоминал выше, реализуйте свою сущность как модель, которая противоречит кодируемому протоколу.

...