You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:04:26