Objective c Swift不符合采用目标C协议的协议错误
在我的swift代码中尝试采用objective-c协议时,我不断遇到“类型不符合协议”错误。我正在实现所有必需的方法,但是编译器为每个方法都给出了一个错误 Objective-C文件中的协议声明为Objective c Swift不符合采用目标C协议的协议错误,objective-c,swift,protocols,Objective C,Swift,Protocols,在我的swift代码中尝试采用objective-c协议时,我不断遇到“类型不符合协议”错误。我正在实现所有必需的方法,但是编译器为每个方法都给出了一个错误 Objective-C文件中的协议声明为 @protocol RBLProtocolDelegate -(void) protocolDidReceiveCustomData:(uint8_t *) data length:(uint8_t) length; -(void) protocolDidReceiveProtocolVersion
@protocol RBLProtocolDelegate
-(void) protocolDidReceiveCustomData:(uint8_t *) data length:(uint8_t) length;
-(void) protocolDidReceiveProtocolVersion:(UInt8) major Minor:(UInt8) minor Bugfix:(UInt8) bugfix;
-(void) protocolDidReceiveTotalPinCount:(uint8_t) count;
-(void) protocolDidReceivePinCapability:(uint8_t) pin Value:(uint8_t) value;
-(void) protocolDidReceivePinMode:(uint8_t) pin Mode:(uint8_t) mode; /* mode: I/O/Analog/PWM/Servo */
-(void) protocolDidReceivePinData:(uint8_t) pin Mode:(uint8_t) mode Value:(uint8_t) value;
@end
在我的swift文件中,我有(这只是其中一种方法,我也实现了所有其他方法,但为了简洁起见,我只展示了一种)
这将产生编译器错误:
Objective-C方法“协议接收协议版本:次要:错误修复:”
由方法提供
“protocolDidReceiveProtocolVersion(uz:minor:bugfix:)”不匹配
需求的选择器
('protocolDidReceiveProtocolVersion:Minor:Bugfix:')
看起来您有区分大小写的问题。您的协议声明
protocolDidReceiveProtocolVersion:Minor:Bugfix:
您正在实施:
protocolDidReceiveProtocolVersion:minor:bugfix:
请注意您版本中的小写字母“m”和“b”
编辑:实际上,在Swift中,Xcode似乎错误地自动完成了协议的实现。我能让它正常工作的唯一方法是修改Objective-C协议定义,对这些参数名称使用小写字母“M”和“B”
即使是微不足道的测试目标-C协议:
@protocol FooProtocol
- (void)foo:(NSInteger)foo Bar:(NSInteger)bar;
@end
由于“Bar”上的大写字母“B”,似乎无法在Swift中实现。我还没有读到关于这种行为的协议,这似乎是一个重大的疏忽。也许向苹果公司提交雷达文件?这似乎是一个bug。正如在引用的“复制”中一样,您可以通过使用精确的Objective-C选择器注释Swift方法来解决问题,在您的例子中是
@objc(protocolDidReceiveProtocolVersion:Minor:Bugfix:)
。谢谢Martin!对不起,重复的问题,我先搜索了堆栈溢出,但不知怎的错过了重复的问题。您是如何知道使用objective-c选择器注释函数的能力的?我不记得在“将Swift与Cocoa和Objective-C结合使用”文档中看到过它。请参阅Swift书籍中的“语言参考->属性”:objc属性可以选择接受一个由标识符组成的单个属性参数。如果要为objc属性所应用的实体向Objective-C公开不同的名称,请使用此属性。
@protocol FooProtocol
- (void)foo:(NSInteger)foo Bar:(NSInteger)bar;
@end