dav*_*oon 5 xcode ios swift cloudkit ckrecord
我试图访问CloudKit中的记录值,这里是MyPin,它有标题和副标题属性/字段值.然而,有时记录值为空(这里是副标题)可能会发生,并且当我调用时它在行处崩溃:
var tempS: String = Annot["Subtitle"] as! String
Run Code Online (Sandbox Code Playgroud)
因为Annot["Subtitle"]不存在......
当我做
println(Annot["Subtitle"])
Run Code Online (Sandbox Code Playgroud)
它返回零
但如果我这样做:
if (Annot["Subtitle"] == nil) {
println("just got a nil value")
}
Run Code Online (Sandbox Code Playgroud)
我从不输入if语句:
有人可以帮我识别记录是否有空值?
这是我的代码行:
let container = CKContainer.defaultContainer()
let publicData = container.publicCloudDatabase
let query = CKQuery(recordType: "MyPin", predicate: NSPredicate(format: "TRUEPREDICATE", argumentArray: nil))
publicData.performQuery(query, inZoneWithID: nil) { results, error in
if error == nil { // There is no error
for Annot in results {
var tempS: String = Annot["Subtitle"] as! String
}}
Run Code Online (Sandbox Code Playgroud)
当你得到Annot["Subtitle"]它时,会给你一个CKRecordValue?返回值,其基类为NSObjectProtocol. 因此,在您的情况下,该字段确实存在,但它不是字符串,因此使用 as 对其进行转换!字符串会使您的应用程序崩溃。由于该字段存在,因此CKRecordValue不会为零。然而该字段的内容为零。当您打印该字段时,它将输出该.description字段的。在你的情况下为零。你可以试试这个代码吗:
if let f = Annot["Subtitle"] {
print("f = \(f) of type \(f.dynamicType)")
}
Run Code Online (Sandbox Code Playgroud)
然后在打印行上设置一个断点,当它停止时,在输出窗口中尝试以下三个语句:
po Annot
po f
p f
Run Code Online (Sandbox Code Playgroud)
之后po Annot您应该会看到该记录中的内容。包括您的字幕字段。这po f并不是那么有趣。它只会输出一个内存地址。但是p f会向您显示实际类型。如果它是一个字符串,您应该看到类似以下内容:(__NSCFConstantString *) $R3 = 0xafdd21e0
PS 也许你应该称其为记录而不是注释。它是一个局部变量,因此应该以小写字符开头。它仍然是一个记录,而不是一个 Annot。
| 归档时间: |
|
| 查看次数: |
306 次 |
| 最近记录: |