gpt4 book ai didi

swift - 是否可以创建一个模仿 CKRecord 的类?

转载 作者:行者123 更新时间:2023-11-30 12:48:31 26 4
gpt4 key购买 nike

因此,我正在创建一个将大量重复使用某些记录的应用程序,因此我想出了一个想法:

    import CloudKit


class Class: CKRecord {

override init(recordType: String = "Class") {
super.init(recordType: recordType)
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

var name: String? {
get {
return value(forKey: "name") as? String
} set {
setValue(newValue!, forKey: "name")
}
}

var classDescription: String? {
get {
return value(forKey: "description") as? String
} set {
setValue(newValue!, forKey: "description")
}
}

var posts: [CKReference]? {
get {
return value(forKey: "posts") as? [CKReference]
} set {
setValue(newValue!, forKey: "posts")
}
}

var users: [CKReference]? {
get {
return value(forKey: "users") as? [CKReference]
} set {
setValue(newValue!, forKey: "users")
}
}

}

后来我在tableViewCOntroler中创建了一个函数,该函数在执行viewDidLoad和刷新tableView时运行(getAllRecords()是一个返回该cas中所有类记录的函数,并且它可以工作):

func refresh() {
queue.addOperation {
self.database.getAllRecords(withRecordType: "Class", withDesiredKeys: ["posts", "name"], sortForkey: "name", ascending: false, withResultLimit: CKQueryOperationMaximumResults, operations: 1){ records, error in
if error == nil {
self.classes = records as! [Class]
OperationQueue.main.addOperation {
self.tableView.reloadData()
self.refreshControl?.endRefreshing()
}
}
}
}
}

然后我创建了单元格:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "class", for: indexPath)

// Configure the cell...
cell.textLabel?.text = (classes[indexPath.row].name)!

return cell
}

现在的问题是我收到一条错误消息:

fatal error: Down-casted Array element failed to match the target type 2016-12-23 22:44:38.681456 EdApp[4524:2186068] fatal error: Down-casted Array element failed to match the target type

我做错了什么?它还能工作吗?谢谢!

最佳答案

getAllRecords 将返回 CKRecords 数组。它不会是 Class 类型。 (这对于类来说是一个非常糟糕的名称)您不能将其强制转换为类。

您可以将其映射到您的类(class),但这并不容易。您需要从 CKRecord 获取编码的系统字段并使用编码器创建您的类。

我认为将 CKRecord 作为类的属性并为接受该 CKRecord 的类创建一个 init 会更容易。然后,您可以将记录映射到一个类,如下所示:self.classes = Records.map { 类(记录:$0) }

我可以建议你看看https://github.com/evermeer/EVCloudKitDao它有一种自动将类转换为 CKRecord 并返回的机制。它将消除大量用于获取和设置属性的管道代码。

关于swift - 是否可以创建一个模仿 CKRecord 的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41308272/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com