2

我试图让Objective-C类采用一个用Swift文件编写的协议。我有Swift Objective-C在一定程度上互操作。 (我可以从Swift构建我的Objective-C类)。无法将符合协议的Objective-C类分配给使用Swift协议的属性

我:

@objc public protocol FooProtocol { 
    func foobar() 
} 

然后,我的Objective-C的文件:

#import <UIKit/UIKit.h> 
#import "SwiftObjcProtocolTest-Bridging-Header.h" 

@protocol FooProtocol 
@end 

@interface ObjClass1 : NSObject <FooProtocol> 

-(void)foobar; 

@end 

并实现了一套:

#import "ObjClass1.h" 

@implementation ObjClass1 

- (void)foobar { 
    NSLog(@"foobar protocol function called"); 
} 

@end 

但是,当我给斯威夫特(主要是在应用程序这样做委托)委托属性并尝试将Objective-C对象分配给它:

var delegate: FooProtocol? 
.... 
delegate = objcInstance 
delegate?.foobar() 

它失败: '?FooProtocol'

不能分配型 'ObjClass1' 的值输入。

我试过用as! FooProtocol强迫它,但是这会导致SIGABRT。

这里有什么问题?

+0

什么,如果你完全删除头文件中的协议定义? –

回答

0

为了得到这个工作,我发现:

  1. 确保导入您的银行代码到的Objective-C(see here)。将其导入ObjClass1.m
  2. 你的协议FooProtocol的向前声明应该是这样的:

    @protocol FooProtocol; 
    

代替:

@protocol FooProtocol 
    @end 

注:虽然这个工作对我来说,有可能是一个更好的解决方案在那里,因为我在ObjClass1.h中发出警告Cannot find protocol definition for 'FooProtocol'

+1

我得到了你提到过的两次警告(警告重复向我表明Xcode不会因为我的设置而下降)。也。我得到'I_OBJC_PROTOCOL _ $ _ FooProtocol,引用:'而没有。 'linker命令失败并退出代码(-v for more ..)'。奇怪的是,点击这些错误甚至没有把我带到更多的信息进一步表明一些东西是错误的或不设置在这里。 –