我有一個專案,在Swift和Objective-C之間進行雙向橋接,并且:
我在Swift檔案中定義了一個@objc協議:
我在Swift檔案中定義了一個@objc協議。
@objc protocol Plugin {
@objc func onDevicePackageReceived(np: NetworkPackage) -> Bool: NetworkPackage.
}
所有實作該協議的類也都在Swift中定義,例如:
@objc class Ping 。NSObject, Plugin {
@objc func onDevicePackageReceived(np: NetworkPackage) -> Bool {
if (np._Type == PACKAGE_TYPE_PING) {
connectedDevicesViewModel.showPingAlert()
return true
}
return false }
}
@objc func sendPing(deviceId: String) -> Void {
let np: NetworkPackage = NetworkPackage(type: PACKAGE_TYPE_PING)
let設備。Device = backgroundService._devices[deviceId] as! Device
device.send(np, tag: Int(PACKAGE_TAG_PING))
}
}
我已經將自動生成的橋接頭檔案匯入到我想使用Plugin介面的Objective-C .m檔案中:
#import "My_App_Name-Swift.h"
橋接頭肯定是正常的,因為其他橋接的Swift代碼也是正常的。
我還在Objective-C的.h頭檔案中向前宣告了協議:
@protocol Plugin;
現在,在Objective-C .m檔案中,我有一個NSMutableDictionary,_plugins,其值是Swift中定義的那些實作Plugin協議的類的物件。我想遍歷每一個物件并呼叫協議中定義的onDevicePackageReceived(np: NetworkPackage)函式,我打算通過將物件確認到Plugin協議中來實作該函式。
for (Plugin* plugin in [_plugins allValues]/span>) {
[plugin onDevicePackageReceived:np];
}
但是它一直在拋出一個錯誤 使用未宣告的識別符號'Plugin'。
我檢查了自動生成的頭檔案,它似乎確實正確地橋接了它:
我檢查了自動生成的頭檔案。
SWIFT_PROTOCOL("_tP16KDE_Connect_Test6Plugin_")
@protocol Plugin<
- (BOOL)onDevicePackageReceivedWithNp:(NetworkPackage * _Nonnull)np SWIFT_WARN_UNUSED_RESULT;
@end。
為了進一步參考,字典插件曾經在Swift中宣告,在Swift中同樣的for回圈可以很好地作業:
for plugin in plugins. values {
(plugin as! Plugin).onDevicePackageReceived(np: np)
}
因此,從本質上講,plugins現在已經被轉移到Objective-C,我正試圖在Object-C中復制這個精確的for回圈,唯一的區別是,協議Plugin和所有實作它的類都在Swift中宣告,所以它們需要被正確匯入到Objective-C。
uj5u.com熱心網友回復:
這種語法對于ObjC中的協議來說并不正確:
for (Plugin* plugin in [_plugins allValues]/span>) {
沒有指向協議存在物的指標。ObjC沒有像Swift那樣的存在性型別(即一個包含符合協議的型別的盒子)。
我相信你的意思是:
for (id<Plugin> plugin in [_plugins allValues]/span>) {
這是 "一個符合Plugin的任意ObjC物件(id)。"
請參閱《使用Objective-C編程》中的《使用協議》,以了解有關ObjC協議語法的詳情。
請參閱《Swift 編程語言》中的作為型別的協議,以了解有關 Swift 協議存在的細節(這與協議本身不是一回事)。
uj5u.com熱心網友回復:
如果你不想寫objc代碼,另一個選擇是為你的objc類創建Swift擴展。
例如,如果它被稱為LegacyPluginHolder,添加新檔案LegacyPluginHolder Extensions.swift并創建擴展:
extension LegacyPluginHolder {
@objc func notifyAllPlugins(package: NetworkPackage) {
//你的Swift代碼在這里移動。
}
}
在LegacyPluginHolder.m中,你可以像這樣使用擴展:
[self notifyAllPluginsWithPackage:np]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/307330.html
標籤:
