可选的在哪里?符号是有条件的吗?有什么区别?
这是我在操场上的测试代码,上面有一个警告,我的评论是“//warning”。
import UIKit
import CloudKit
let int: UInt8 = 1
let data: Data = Data([int])
let record: CKRecord = CKRecord(recordType: "record_type")
record.setObject(data as __CKRecordObjCValue?, forKey: "field")
record.setObject(data as? __CKRecordObjCValue, forKey: "field") // warning
警告信息显示:
从“Data”到“CKRecordObjCValue”的条件转换始终成功
Xcode如何根据可选的位置解释每个示例?马克走了?
如果我做数据变量数据?相反,如下面的代码所示,警告更改为:
从“Data?”到“CKRecordObjCValue”是一个桥接转换;是否要使用“as”?
import UIKit
import CloudKit
let int: UInt8 = 1
let data: Data? = Data([int])
let record: CKRecord = CKRecord(recordType: "record_type")
record.setObject(data as __CKRecordObjCValue?, forKey: "field")
record.setObject(data as? __CKRecordObjCValue, forKey: "field")
什么是桥接转换?
最佳答案
首先,请使用密钥订阅和CKRecordValue
(而不是丑陋的__CKRecordObjCValue
)。as? CKRecordValue
是有条件的下推(错误)as CKRecordValue?
是到可选协议类型的桥接(右)
let int: UInt8 = 1
let data : Data? = Data([int])
let record = CKRecord(recordType: "record_type")
record["field"] = data as CKRecordValue?
在非可选的情况下,只需桥接没有问号的类型
let data = Data([int])
...
record["field"] = data as CKRecordValue
注:
当
Data
符合CKRecordValueProtocol
时,桥铸件是多余的record["field"] = data