无法将符合协议的Objective-C类分配给具有Swift协议

时间:2017-05-28 02:07:47

标签: objective-c swift protocols bridging-header objc-bridging-header

我试图让Objective-C类采用Swift文件编写的协议。我在某种程度上让Swift得到了Objective-C的互操作。 (我可以从Swift构建我的Objective-C类)。

我有:

@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

和impl:

#import "ObjClass1.h"

@implementation ObjClass1

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

@end

但是当我给Swift(主要在app委托中执行此操作)委托属性并尝试将Objective-C对象分配给它时:

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

它失败了:

  

无法指定类型&#39; ObjClass1&#39;的值输入&#39; FooProtocol?&#39;。

我尝试用as! FooProtocol强制它,但这导致了SIGABRT。

这里有什么问题?

1 个答案:

答案 0 :(得分:0)

为了实现这一目标,我发现:

  1. 确保将Swift代码导入Objective-C(see here)。将其导入ObjClass1.m
  2. 您对协议FooProtocol的前瞻性声明应如下所示:

    @protocol FooProtocol;
    
  3. 而不是:

        @protocol FooProtocol
        @end
    

    注意:虽然这对我有用,但在ObjClass1.h Cannot find protocol definition for 'FooProtocol' p中收到警告时,可能会有更好的解决方案。