簡體   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