在 Xcode 12.3 中,CoreBluetooth.CBService.peripheralobjective-c 中定義為:
@property(assign, readonly, nonatomic) CBPeripheral *peripheral;
更新:這是 Xcode 12.3 中上述內容的快速翻譯:
unowned(unsafe) open var peripheral: CBPeripheral { get }
在 Xcode 13.0 中,CBService.peripheral在 swift 中定義為:
weak var peripheral: CBPeripheral? { get }
Apple 的檔案指出,此 API 自 iOS5 以來就已存在,并且沒有任何更改。但是在 Xcode 13 中,該變數顯然是可選的。(并且它在 Xcode 12.3 中不是可選的,因為它缺少屬性nullable。)
修復相對容易(例如service.peripheral -> service?.peripheral) - 但它使得無法對 Xcode 12.3 和 13.0 使用相同的代碼。我想知道這里是否有一些我遺漏的細微差別?
uj5u.com熱心網友回復:
Optionals 是 Swift 的固有部分,而不是 Objective-C 的一部分。Swift 中的非空參考保證具有值,而 Objective C 中的任何參考理論上都可以是null.
在nullable和nonnull裝飾進行了介紹,以提高互操作性與斯威夫特有副作用,他們也更清晰地記錄目標C的API。
Core Bluetooth 是一個 Objective C API,正如您所注意到的,它從 iOS5 開始就可用了;在 Swift 和nullable裝飾器之前。
因此,并不是 API 發生了太大變化,而是您將 Objective C API 與 Swift API 進行比較,而 Apple 尚未將nullable裝飾器添加到 Core Bluetooth API。
這些 API 都沒有改變;雨燕的宣告peripheral上CBService已經始終是一個可選的。Objective-C的宣告也從來沒有過nullable ,但一個null價值一直是可能的。
添加nullable不會改變 API 的行為,只會改變它在 Objective C 中的宣告。這可能是 Objective-C 代碼的重大變化,或者至少可能導致編譯失敗,因此 Apple 沒有理由更改它并且有充分的理由不這樣做。
更新
從您的評論來看,確實,Swift 宣告中CBService.peripheral從 fromunowned(unsafe)到弱可選項似乎發生了重大變化。
這是一個更安全的宣告,因為在之前的定義中,您有責任檢查這peripheral不是nil,如果不這樣做,可能會發生崩潰。
在我多年使用 Core Bluetooth 編程的程序中,我認為我從未需要使用CBService.peripheral,但是,您可以使用基于 Swift 版本的條件編譯來撰寫適用于 Xcode 13 和更早版本的代碼:
var p: CBPeripheral?
#if swift(<5.5)
if s.peripheral != nil {
p = s.peripheral
}
#else
p = s.peripheral
#endif
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/370550.html
