Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.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
在Swift中将id转换为objective-c定义的协议_Objective C_Swift - Fatal编程技术网

在Swift中将id转换为objective-c定义的协议

在Swift中将id转换为objective-c定义的协议,objective-c,swift,Objective C,Swift,我有一个用Objective-C编写的框架。其中一个公共方法返回一个id。 在Objective-C中,我使用强制转换将id值类型转换为协议,以便调用协议中定义的方法。但是当我想在Swift中使用这个框架时,我不知道如何将这个id转换成协议 @interface MyManager : NSObject + (id)generateProxyFromXML:(NSString*)xml protocol:(Protocol*)protocol; @end 在Objective-C中,我使用以下

我有一个用Objective-C编写的框架。其中一个公共方法返回一个id。 在Objective-C中,我使用强制转换将id值类型转换为协议,以便调用协议中定义的方法。但是当我想在Swift中使用这个框架时,我不知道如何将这个id转换成协议

@interface MyManager : NSObject
+ (id)generateProxyFromXML:(NSString*)xml protocol:(Protocol*)protocol;
@end
在Objective-C中,我使用以下代码:

@protocol AProtocol <NSObject>
- (void)doSomething;
@end

id<AProtocol> proxy = [MyManager generateProxyFromXML:@"" protocol:@protocol(AProtocol)];
[proxy doSomething];
如何将此代理传输到协议并调用该方法

let proxy = MyManager.generateProxyFromXML("", protocol: Protocol!(AProtocol)) as! AProtocol
生成“无法强制转换…”运行时错误

更多信息

在XML中,我定义了我的数据库操作。我将XML和协议传递给MyManager以生成DAO代理

在MyManager中,我使用“objc_allocateClassPair”动态创建一个名为“DAOProxy#protocol#u name#”的代理类。然后使用“protocol_copyMethodDescriptionList”查找协议的方法列表。并使用“class_addMethod”将这些方法添加到新类中


最后,我使用类“DAOProxy#protocol#name#”创建一个实例,并以“id”的形式返回。因此,我可以使用此代理实例执行数据库操作。

目前我无法测试此操作,但请尝试:

let proxy: protocol<AProtocol> = MyManager.generateProxyFromXML("")
let proxy:protocol=MyManager.generateProxyFromXML(“”)

让proxy=MyManager.generateProxyFromXML(“”)作为!协议

它不起作用。我试着用AnyObject替换协议,它还可以。我还可以成功地调用该方法。但对于任何对象,它都不是完美的。
let proxy: protocol<AProtocol> = MyManager.generateProxyFromXML("")
let proxy = MyManager.generateProxyFromXML("") as! protocol<AProtocol>