Сохранить / получить массив структур в iCloud - PullRequest
0 голосов
/ 18 декабря 2018

На самом деле я учусь сохранять данные в iCloud.Я могу без проблем сохранить / получить строку / число, но у меня есть переменная структуры, которую я хочу сохранить / извлечь из облака, и я не могу понять, как это сделать.Я пробовал много разных вещей без результата.

Может быть, кто-то может дать мне пример кода, который может сохранить / извлечь эту переменную "Var2" из iCloud?

struct structure: Codable{
    var a : String!
    var b : String!
    var c : String!
    var d : String!
    var e : Double!
}

var Var2 = [
    structure(a: "-12.1", b: "5.9", c: "Hello", d: "2017-01-21 05:55:55", e: 5),
    structure(a: "151.17", b: "-1.8", c: "All", d: "2018-04-27 07:54:25", e: 0)
]

Весли вам нужен мой фактический код:

import UIKit
import CloudKit

class ViewController: UIViewController {


    struct structure: Codable{
        var a : String!
        var b : String!
        var c : String!
        var d : String!
        var e : Double!}


    @IBAction func Button(_ sender: Any) {

        let Var1 = "Have Fun :)"     

        let Var2 = [
            structure(a: "-12.1", b: "5.9", c: "Hello", d: "2017-01-21 05:55:55", e: 5),
            structure(a: "151.17", b: "-1.8", c: "All", d: "2018-04-27 07:54:25", e: 0)]



        let MyRecord = CKRecord(recordType: "Test")

        // Changing the next line to "Var2" give an error
        MyRecord.setValue(Var1, forKey: "Content1")

        CKContainer.default().privateCloudDatabase.save(MyRecord) { (record, error) in
            guard record != nil else { return }
            print("saved record")
        }
    }
}

1 Ответ

0 голосов
/ 18 декабря 2018

Как частично упомянуто в комментариях, имя состоит из начальной заглавной буквы и переменных со стартовой строчной буквой и объявляет элементы как необязательные

struct Structure: Codable {
    var a, b, c, d : String
    var e : Double
}

Наиболее эффективным решением является создание нового типа записи сатрибуты, соответствующие членам структуры, и сохраняют каждый экземпляр Structure отдельно

for item in var2 {    

   let myRecord = CKRecord(recordType: "Structure")
   myRecord["a"] = item.a as CKRecordValue
   myRecord["b"] = item.b as CKRecordValue
   // etc.
   myRecord["e"] = NSNumber(value: item.e)
}
...

В качестве альтернативы можно объявить атрибут Content1 как (NS)Data и закодировать массив структуры с помощью JSONEncoder

 do {
    let data = JSONEncoder().encode(var2)
    let myRecord = CKRecord(recordType: "Test")
    myRecord["Content1"] = data
 } catch { print(error) }
...