从Objective-C访问Swift代表的正确方式是什么?

从Objective-C访问Swift代表的正确方式是什么?,objective-c,swift,delegation,Objective C,Swift,Delegation,环境:Xcode 6.1.1和Xcode 6.2测试版 问候语: 我需要从同一项目中相邻的Objective-C文档发布Swift文档中的NSString。例如,在Swift页面上显示Objective-C中生成的“Hello World”我做了一个概念验证演示;基于反馈。 我正在考虑通过协议模式使用ObjC-->Swift委托,如下所示: 注意:Swift文件是代表。 在这里,我从Objective-C调用Swift中的委托方法: #pragma mark - Action metho

环境:Xcode 6.1.1和Xcode 6.2测试版 问候语:
我需要从同一项目中相邻的Objective-C文档发布Swift文档中的NSString。例如,在Swift页面上显示Objective-C中生成的“Hello World”
我做了一个概念验证演示;基于反馈。 我正在考虑通过协议模式使用ObjC-->Swift委托,如下所示: 注意:Swift文件是代表。 在这里,我从Objective-C调用Swift中的委托方法:

#pragma mark - Action methods
- (IBAction)sendDelegateAction:(UIButton *)sender {
    [_delegate radiusString:@"Hello World"];
}
我实例化了Objective-C文件,以将委托链接到实例(我希望我没有弄错):

到目前为止,编译器抱怨找不到Swift协议。
以下是协议(以Swift声明):

下面是Objective-C头文件中对该协议的代理引用:

@interface MyObjCTableViewController : UIViewController<UITableViewDelegate, UITableViewDataSource>
@property (nonatomic, weak) id<DiscoveryContributeProtocol> delegate;
@end
@接口MyObjectableViewController:UIViewController
@属性(非原子,弱)id委托;
@结束
但是,编译器找不到协议:
顺便说一句:当我把桥引用放在ObjC的头文件中时,我得到一个编译器错误:

两个问题:

  • 我是否有正确的模式(我是否正确实例化了ObjC)
  • 如何使Objective-C部分看到代表链接的Swift协议

  • 您的想法是正确的,但是有一些bug阻止了它的工作

  • 您已声明
    geo32bounders
    符合
    DiscoveryContributeProtocol
    ,但它不需要也不实际实现它,它只有一个符合该协议的属性。这就是“Method”radiusString:“not implemented”错误的来源:

  • 最后,虽然不是一个bug,但您的协议实际上应该被称为
    DiscoveryContributeDelegate
    ——我们通常不会在协议名称中使用“protocol”


  • 可以我制作了一个概念验证/演示应用程序。与您建议的修订(请参阅上面重新编写的问题)。我接近了吗?@FrederickC.Lee第1项不正确,桥接头导入需要在obj-c头文件中,而不是在实现文件中。这就是为什么在接口中会出现“找不到协议声明”的原因。就我个人而言,我会将桥接头导入到您的
    *\u prefix.h
    文件中,然后您就会知道它无处不在。我已将桥接头添加到ObjC的头文件中。但是编译器找不到它。请参见上面添加的要查询的材料。
    @objc protocol DiscoveryContributeProtocol {
        // optional
        func radiusString(radiusString:String)
    }
    
    @interface MyObjCTableViewController : UIViewController<UITableViewDelegate, UITableViewDataSource>
    @property (nonatomic, weak) id<DiscoveryContributeProtocol> delegate;
    @end
    
    @interface Geo32Boundaries: UIViewController    // <-- that's all you need
    
    geo32Controller.delegate = self