2016-12-23 77 views
0

所以我創建一個應用程序,將被再利用一些記錄了很多,所以我想出了一個主意,這樣做:是否可以創建一個模仿CKRecord的類?

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()是返回這個中科院所有的類記錄的功能和它的作品):

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

我做錯了什麼?它可以工作嗎?謝謝!

回答

0

getAllRecords將返回一組CKRecords。它不會是Class類型的。 (對於一個類來說,這是一個非常糟糕的名字)你不能只將它投射到一個類。

您可以將它映射到您的班級,但這並不容易。您需要從CKRecord獲取encodedSystemFields並使用編碼器創建您的類。

我認爲將CKRecord作爲你的類的屬性併爲你的類創建一個接受CKRecord的init會更容易。 self.classes = {records.map類(記錄:$ 0)}

我能sugest你看看https://github.com/evermeer/EVCloudKitDao它有一個機制來自動轉換,你可以接着用類似的記錄映射到一個類上課到CKRecord並返回。這將消除很多你的管道代碼來獲取和設置屬性。

+0

謝謝你的回答!我認爲它很好地回答了我的問題。很不幸的是,我不能直接將CKRecord轉換成我創建的類(它會加快速度),但它也可以。 –

相關問題