迅捷编译器错误?不能使用"direct"作为方法名称



谁能帮我检查一下这个吗?我做了一个Swift3/Obj-C项目*,有三个小文件:

ChannelSpy.swift:

import Foundation  
class ChannelSpy: RMQChannel {  
    func direct(_ name: String!) {}  
} 

RMQChannel.h:

#import <Foundation/Foundation.h>  
@protocol RMQChannel  
- (void) direct:(NSString *)name;  
@end

Bridging-Header.h:

#import "RMQChannel.h"

但是这不会编译!下面是我得到的错误:
类型'ChannelSpy'不符合协议'RMQChannel'
   协议要求函数' different '类型为'(String!) -> Void';你要加个存根吗?

/Proj/. ./ChannelSpy.swift:2:7: error: type 'ChannelSpy'不符合协议'RMQChannel'类ChannelSpy: RMQChannel {^__ObjC。RMQChannel:2:17:注意:协议要求函数' different '的类型为'(String!) -> Void';你要加个存根吗?__name: String!^之前

这个"不同"的东西是什么?我(或Rabbit*项目)不允许使用"direct"这个名字吗?我在谷歌上搜索了这个(当然,广泛地),我在古老的BSD代码残余中看到了#define direct dirent的痕迹,但我确信这与任何事情都没有关系。

& # 42;-实际上我正在尝试构建RabbitMQ客户端,同时将其移植到Swift 3和OS X(它不正式支持)。也就是说,测试是用Swift编写的,而Rabbit库本身仍然是Objective-C。我正在检查我的分支到GitHub,以便其他人在OS x上需要RabbitMQ

系统包含文件<sys/dir.h>定义:

/*
 * Backwards compatibility.
 */
#define direct dirent

我不知道这个定义是什么,但显然从Foundation.h中(间接)包含<sys/dir.h>,因此在所有(Objective-)C代码中,directdirent代替。

因此协议以

的形式暴露给Swift
public protocol RMQChannel {
    public func dirent(_ name: String!)
}

如果重命名属性是不可能的,然后undef宏(之后,包括系统标头)应该是一个可行的解决方案:

#undef direct
@protocol RMQChannel  
- (void) direct:(NSString *)name;  
@end

最新更新