什么是 Swift 中的桥接转换,如以下警告所示:来自“数据?”的条件向下转换to 'CKRecordValue 是一种桥接转换
Posted
技术标签:
【中文标题】什么是 Swift 中的桥接转换,如以下警告所示:来自“数据?”的条件向下转换to \'CKRecordValue 是一种桥接转换【英文标题】:What is a bridging conversion in Swift as in the following warning: Conditional downcast from 'Data?' to 'CKRecordValue is a bridging conversion什么是 Swift 中的桥接转换,如以下警告所示:来自“数据?”的条件向下转换to 'CKRecordValue 是一种桥接转换 【发布时间】:2019-08-01 11:43:33 【问题描述】:什么是 Swift 中的桥接转换? “桥接”是什么意思?
我在以下代码中收到警告,其中我用注释“//警告”进行了标记:
import UIKit
import CloudKit
let int: UInt8 = 1
let data: Data? = Data([int])
let record: CKRecord = CKRecord(recordType: "record_type")
record.setObject(data as? CKRecordValue, forKey: "field") // warning
警告说:
“数据?”的条件向下转换到“CKRecordValue”(又名“__CKRecordObjCValue”)是一种桥接转换;你的意思是用'as'吗?
我也有使用桥接转换的代码:
import Foundation
import CoreData
extension Vision
@nonobjc public class func fetchRequest() -> NSFetchRequest<Vision>
return NSFetchRequest<Vision>(entityName: "Vision")
@NSManaged public var media: NSObject?
private var privateEntityInstance: Vision
private var privateMedia: Data? = nil
privateEntityInstance.media = privateMedia as NSObject?
其中 privateEntityInstance.media 是可选的,privateMedia 也是可选的。该代码是否有效,以便 CoreData 将保存媒体属性的适当值,无论它是 NSObject 还是 nil?
【问题讨论】:
【参考方案1】:as? CKRecordValue
是有条件的向下转换(从不太具体到更具体的类型)
as CKRecordValue?
是一种桥接转换(例如,从具体类型到协议或从 Swift 类型到其对应的 Objective-C 类型)。这是编译器所期望的语法。
但是在 Swift 5 中 Data
符合 CKRecordValueProtocol
所以你可以写
let int: UInt8 = 1
let data = Data([int])
let record = CKRecord(recordType: "record_type")
record["field"] = data
建议始终优先使用 Key Subscription record["field"]
而不是 setObject:forKey:
,因为后者需要将桥转换为对象,例如
let data = Data([int]) as NSData // or as CKRecordValue
...
record.setObject(data, forKey: "field")
并且不要注释比实际类型(非可选)Data
更差的类型(可选)Data?
。
【讨论】:
“桥接转换”是什么意思? “桥接”是什么意思? 在您的情况下,桥接转换是在同一级别上转换为协议的具体类型。 好的。我得到它。我认为桥梁也是 Swift 类型和 Objective-C 类型之间的转换。我说的对吗? 是的,我添加了一个示例。 PS:如果media
应该始终包含原始Data
,则将其声明为Data
您可以将该属性声明为可选并分配一个非可选值。没有理由将类型注释为可选。更重要的是更喜欢 Swift 强类型 Data
而不是 Objective-C 无类型 NSObject
。 Core Data 框架隐式执行桥接。以上是关于什么是 Swift 中的桥接转换,如以下警告所示:来自“数据?”的条件向下转换to 'CKRecordValue 是一种桥接转换的主要内容,如果未能解决你的问题,请参考以下文章