尝试在 Swift 中使用来自 CKRecord 的原始数据形式

Posted

技术标签:

【中文标题】尝试在 Swift 中使用来自 CKRecord 的原始数据形式【英文标题】:Trying to use the original form of data from a CKRecord in Swift 【发布时间】:2016-09-04 19:43:52 【问题描述】:

我正在尝试将从 cloudkit 下载的 CKRecords 转换回原来的数据形式(在本例中为 CLLocation)。当我尝试在第 17 行调用函数时,出现错误“无法将 'CKRecord' 类型的值转换为预期的参数类型 'CLLocation'”。

func loadLocation(completion: (error:NSError?, records:[CKRecord]?) -> Void)
    
        let query = CKQuery(recordType: "Location", predicate: NSPredicate(value: true))
        CKContainer.defaultContainer().publicCloudDatabase.performQuery(query, inZoneWithID: nil)
            (records, error) in
            if error != nil 
                print("error fetching locations: \(error)")
                completion(error: error, records: nil)
             else 
                print("found locations: \(records)")
                completion(error: nil, records: records)
                guard let records = records else 
                    return
                
                for(var i = 0; i<records.count; i += 1)
                
                    addBoundry(records[i])
                
            
        
    

【问题讨论】:

【参考方案1】:

通过将记录的键设置到您的位置来保存您的记录:

recordThatYouAreSaving.setObject(yourLocation, forKey: "location")

然后得到它:

addBoundry(records[i]["location"] as! CLLocation)

【讨论】:

我收到警告“从 'CKRecord' 转换为不相关的类型 'CLLocation' 总是失败”【参考方案2】:

即使查询值为 CLLocation 的记录,查询的结果仍然是 CKRecord 的数组,而不是 CLLocation 的数组。如果 CKRecord 包含 CLLocation,您需要通过调用 objectForKey:提取它并将其转换到 CLLocation。

【讨论】:

我在哪里叫它@matt 显然,无论您在哪里遇到错误。我的意思是,看,当你创建这个 CKRecord 并将值放入其中时,你使用了一个键,对吧?现在您需要该密钥来获取值。否则,你以为钥匙是干什么用的? 我收到错误“无法转换 'CKRecordValue?' 类型的值?”到预期的参数类型 'CLLocation'" 你需要cast它。

以上是关于尝试在 Swift 中使用来自 CKRecord 的原始数据形式的主要内容,如果未能解决你的问题,请参考以下文章

如何从来自 fetchAllSubscriptionsWithCompletionHandler 的 CKSubscriptionID 中检索 CKRecord?

swift CKRecord扩展

如果 Swift 中存在 NSUserDefault,则尝试更新 CLLocation

NSCoding 到 CKRecord

在 CloudKit 中创建指向多个 CKRecord 的引用列表

CKRecord setValue:forKey 或 setObject:forKey