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

Posted

技术标签:

【中文标题】无法将符合协议的 Objective-C 类分配给具有 Swift 协议的属性【英文标题】:Cannot assign protocol-conforming Objective-C class to a property with Swift Protocol 【发布时间】:2017-05-28 02:07:47 【问题描述】:

我试图让一个 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

和实现:

#import "ObjClass1.h"

@implementation ObjClass1

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


@end

但是当我给 Swift(主要在应用程序委托中这样做)一个委托属性并尝试将 Objective-C 对象分配给它时:

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

它失败了:

无法将类型“ObjClass1”的值分配给类型“FooProtocol?”。

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

这里有什么问题?

【问题讨论】:

什么,如果你完全删除头文件中的协议定义? 【参考方案1】:

为了让它工作,我发现:

    确保将 Swift 代码导入到 Objective-C (see here)。将其导入ObjClass1.m

    您对协议FooProtocol 的前向声明应如下所示:

    @protocol FooProtocol;
    

代替:

    @protocol FooProtocol
    @end

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

【讨论】:

我收到了你提到的两次警告(警告重复向我表明 Xcode 并没有因为我的设置太失败)。还。我得到了I_OBJC_PROTOCOL_$_FooProtocol, referenced from:,而不是什么都没有。和linker command failed with exit code (-v for more..)。奇怪的是,点击这些错误甚至没有让我获得更多信息,进一步表明这里有问题或没有设置。

以上是关于无法将符合协议的 Objective-C 类分配给具有 Swift 协议的属性的主要内容,如果未能解决你的问题,请参考以下文章

如何创建符合 Swift 和 Objective-C 之间共享协议的类方法?

如何在Objective-C中将孩子分配给父母?

来自符合协议的未知类的 Swift init

有没有办法在 Swift 中一次将委托分配给同一类的多个对象?

如何将符合协议的类声明为参数类型?

将实现协议的 Swift 类导入到 Objective-C 类中