使用sharpie生成ApiDefinition.cs后,Xamarin iOS绑定Swift协议编译失败
iOS Binding Library编译错误:Swift Protocol类型无法识别的解决方法
构建iOS Binding Library项目时,若函数参数或公开字段为Swift Protocol类型,即便ApiDefinition.cs(由sharpie工具生成)中已定义对应类型,仍会抛出编译错误:
The type or namespace name 'xxx' could not be found (are you missing a using directive or an assembly reference?)
问题示例
Swift原代码
@objc(ScanOperation) public protocol ScanOperation { @obj(onItemAdded:) func onItemAdded(itemObj: ItemData) } @objc(ScanAgent) public class ScanAgent : NSObject { @objc(Initialize:) public func Initialize(scanOperation: ScanOperation) { } }
Sharpie生成的ApiDefinitions.cs代码
[Protocol] interface ScanOperation { // @required -(void)onItemAdded:(ItemData * _Nonnull)itemObj; [Abstract] [Export("onItemAdded:")] void OnItemAdded(ItemData itemObj); } // @interface ScanAgent : NSObject [BaseType(typeof(NSObject))] interface ScanAgent { // -(void)Initialize:(id<ScanOperation> _Nonnull)scanOperation; [Export("Initialize:")] void Initialize(ScanOperation scanOperation); }
以上代码编译时会触发上述类型找不到的错误。
修复方案
Sharpie生成的Protocol定义缺少必要的特性标记,导致Xamarin无法正确映射Objective-C中的协议类型。只需修改Protocol的定义即可:
修正后的ApiDefinitions.cs代码
[Protocol(Name = "ScanOperation"), Model] interface ScanOperation : INativeObject { // @required -(void)onItemAdded:(ItemData * _Nonnull)itemObj; [Abstract] [Export("onItemAdded:")] void OnItemAdded(ItemData itemObj); } // @interface ScanAgent : NSObject [BaseType(typeof(NSObject))] interface ScanAgent { // -(void)Initialize:(id<ScanOperation> _Nonnull)scanOperation; [Export("Initialize:")] void Initialize(ScanOperation scanOperation); }
关键修改说明
- 添加
[Model]特性:告知Xamarin该接口对应Objective-C中的id<Protocol>类型,使其能被正确识别为可传递的协议实例。 - 继承
INativeObject:处理原生对象的生命周期管理,确保Xamarin能正确与Objective-C对象交互。 - 指定
Name = "ScanOperation":与Swift代码中@objc(ScanOperation)的命名保持一致,避免类型映射匹配失败。
若ItemData为自定义类型,需确保其已在ApiDefinitions.cs或Structs.cs中正确定义,否则也会引发类似的类型找不到错误。
内容的提问来源于stack exchange,提问作者Derorrist
相关产品推荐
相关产品推荐

