在 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
我正在尝试将旧的 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