可选的在哪里?符号是有条件的吗?有什么区别?
这是我在操场上的测试代码,上面有一个警告,我的评论是“//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

10-07 19:56
查看更多