是否有可能创建一个模仿CKRecord的课程?

时间:2016-12-23 21:57:30

标签: swift xcode swift3 cloudkit

所以我正在创建一个会重复使用某些记录的应用程序,所以我提出了一个想法:

    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
}

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

  

致命错误:Down-casted Array元素无法与目标类型匹配   2016-12-23 22:44:38.681456 EdApp [4524:2186068]致命错误:下载的数组元素无法匹配目标类型

我做错了什么?它甚至可以工作吗?谢谢!

1 个答案:

答案 0 :(得分:0)

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

您可以将它映射到您的班级,但这并不容易。您需要从CKRecord获取encodedSystemFields并使用编码器创建您的类。

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

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