繁体   English   中英

什么是 Swift 中的桥接转换,如以下警告所示:来自“数据”的条件向下转换? 到 'CKRecordValue 是一个桥接转换

[英]What is a bridging conversion in Swift as in the following warning: Conditional downcast from 'Data?' to 'CKRecordValue is a bridging conversion

什么是 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?

  • as? CKRecordValue 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM