在 obj-c 中调用 swift 委托

call swift delegate in obj-c

我正在尝试将旧的 obj-c 应用程序移植到 swift,并在此过程中重组和重新编程所有内容。有些事情需要稍后再处理,我必须在 swift 中使用旧的 obj-c,这不是问题,但我 运行 遇到了一个似乎无法解决的严重问题.

我有一个从 swift 包装器调用的 obj-c“连接”class。问题是,我无法将委托对象传递给 obj-c,或者至少我不知道如何传递。

这是我的代码:

//swift protocol

@objc protocol ConnectionDelegate
{
    @objc func connected() -> Void
}

//swift class

@objc class ConnectionManager : NSObject, ConnectionDelegate
{
    var connectionThread : ConnectionThread
    init(){
        connectionThread.inti()
        connectionThread.registerDelegate(self) //Value of type 'ConnectionThread' has no member of 'registerDelegate'
        connectionThread.testFunc() //all ok
    }

    @objc func connected(){
    }
}

//obj-c header ConnectionThread.h

@class ConnectionDelegate;

@property (nonatomic, weak) ConnectionDelegate* delegate;

-(void) registerDelegate: (ConnectionDelegate*) delegate;
-(void) testFunc;


//obj-c class ConnectionThread.h

#import ".....Swift.h"

@synthesize delegate;

-(void) registerDelegate:(ConnectionDelegate*) delegate
{
    self.delegate = delegate;
}

-(void) testFunc
{
    
}

以后,请将您的实际代码复制并粘贴到您的问题中。您问题中的代码充满错误,这意味着它不是您的真实代码,这些错误可能导致无法正确回答您的问题。

因此,假设您在发布的代码中没有太多 错误,那么问题是您在欺骗编译器。具体来说,您的 Objective-C 头文件 ConnectionThread.h 是这样说的:

@class ConnectionDelegate;

但是 ConnectionDelegate 而不是 和 class。它是一个协议,因此您需要将其声明为协议。然后,您还必须对符合协议的类型使用正确的 Objective-C 语法,即 id<ConnectionDelegate>.

// ConnectionThread.h

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@protocol ConnectionDelegate;

@interface ConnectionThread : NSObject

@property (nonatomic, weak) id<ConnectionDelegate> delegate;

- (void)registerDelegate:(id<ConnectionDelegate>)delegate;

@end

NS_ASSUME_NONNULL_END
// ConnectionThread.m

#import "ConnectionThread.h"

@implementation ConnectionThread

- (void)registerDelegate:(id<ConnectionDelegate>)delegate {
    self.delegate = delegate;
}

@end