Я действительно учусь сохранять данные в 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")
}
}
}



Как частично упоминалось в комментариях, имена структур начинаются с заглавной буквы, а переменные - с начальной строчной буквы, а члены объявляются необязательными.
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) }
Несвязанные, но 1) Структуры имени с начальной заглавной буквы 2) Никогда никогда объявляют элементы в структурах, соответствующих
Codable, как неявные развернутые необязательные параметры. Удалите восклицательные знаки. Код компилируется