[英]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.