什么是 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 是一种桥接转换的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Swift Dictionary 不可桥接?

Swift optionals - 从'x'到'x'的条件转换警告总是成功

某些 Java 泛型类型转换中的类型安全警告是啥意思?

swift包管理器中的“警告:没有要在包中构建的目标”错误

Swift 3 中的十进制到双精度转换

什么是 Swift 中的部分申请闭包#1