Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c Swift不符合采用目标C协议的协议错误_Objective C_Swift_Protocols - Fatal编程技术网

Objective c Swift不符合采用目标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

在我的swift代码中尝试采用objective-c协议时,我不断遇到“类型不符合协议”错误。我正在实现所有必需的方法,但是编译器为每个方法都给出了一个错误

Objective-C文件中的协议声明为

@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