Objective-C与Swift委托问题:静态函数调用Swift回调方法
解决静态函数中通过委托调用Swift方法的问题
你遇到的核心问题是静态(全局)函数test()不属于任何类的实例,它无法直接访问实例的delegate属性,而callbackToSwift:是依赖于实例的方法。要解决这个问题,关键是让静态函数能获取到持有MyDelegate的那个类实例。
下面是两种可行的解决方案:
方案一:给静态函数传入实例引用
直接将持有delegate的类实例作为参数传递给test()函数,这样就能在静态函数内部调用实例的callbackToSwift:方法:
修改后的MyFile.mm代码
// 先补全持有实例方法的类声明(假设类名为MyClass) @interface MyClass : NSObject @property (nonatomic, weak) id<MyDelegate> delegate; - (void)callbackToSwift:(int)testInteger; @end @implementation MyClass - (void)callbackToSwift:(int)testInteger { if (self.delegate != nil) { [self.delegate callbackInteger: testInteger]; } } @end // 修改静态函数,接收MyClass实例作为参数 static void test(MyClass *instance) { // 调用实例方法,间接触发Swift的callbackInteger [instance callbackToSwift:100]; // 这里传入你需要的整数 }
在Swift中调用静态函数时传入实例
在你的ViewController里配置并调用:
class ViewController: UIViewController, MyDelegate { let myClassInstance = MyClass() override func viewDidLoad() { super.viewDidLoad() myClassInstance.delegate = self // 调用静态函数,传入实例 test(myClassInstance) } func callbackInteger(_ testInteger: Int) { print("testInteger: \(testInteger)") } }
方案二:使用单例模式(适合全局唯一实例的场景)
如果你的MyClass是全局唯一的,可以将其设计为单例,这样静态函数就能直接获取实例:
修改后的MyFile.mm代码
@interface MyClass : NSObject @property (nonatomic, weak) id<MyDelegate> delegate; + (instancetype)sharedInstance; - (void)callbackToSwift:(int)testInteger; @end @implementation MyClass + (instancetype)sharedInstance { static MyClass *instance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [[self alloc] init]; }); return instance; } - (void)callbackToSwift:(int)testInteger { if (self.delegate != nil) { [self.delegate callbackInteger: testInteger]; } } static void test() { // 获取单例实例 MyClass *instance = [MyClass sharedInstance]; [instance callbackToSwift:200]; } @end
在Swift中设置单例的delegate
class ViewController: UIViewController, MyDelegate { override func viewDidLoad() { super.viewDidLoad() let sharedInstance = MyClass.sharedInstance() sharedInstance.delegate = self // 直接调用静态函数 test() } func callbackInteger(_ testInteger: Int) { print("testInteger: \(testInteger)") } }
关键注意点
- 确保
delegate属性声明为weak,避免Swift和OC之间出现循环引用。 - 静态函数本身不持有实例引用,所以必须通过传入或单例的方式获取实例,才能访问到
delegate。
内容的提问来源于stack exchange,提问作者user3596335
相关产品推荐
相关产品推荐

