Ios 如何将带有回调的Objective-C传递给Swift方法?

Ios 如何将带有回调的Objective-C传递给Swift方法?,ios,swift,Ios,Swift,我真的不知道怎么问这个问题,但是: 我在Objective-C和Swift之间架起了一座桥梁 在Obj-C类中,我调用Swift类 我的课很快 我的Obj-C类应该有一个块来接收来自Swift类的一些数据 它应该是这样的(这个代码是错误的,但是我认为它应该是这样的) Obj-C 迅捷的 那么,有什么帮助吗?根据您的规范,这部分是不可能的: productsRequestCompletionHandler?(true, products) 如果ProductsRequestCompletionH

我真的不知道怎么问这个问题,但是:

  • 我在Objective-C和Swift之间架起了一座桥梁

  • 在Obj-C类中,我调用Swift类

  • 我的课很快
  • 我的Obj-C类应该有一个块来接收来自Swift类的一些数据

  • 它应该是这样的(这个代码是错误的,但是我认为它应该是这样的)

  • Obj-C

    迅捷的


    那么,有什么帮助吗?

    根据您的规范,这部分是不可能的:

    productsRequestCompletionHandler?(true, products)
    
    如果ProductsRequestCompletionHandler只接受一个值,则不能返回两个值。因此,您必须修改ProductsRequestCompletionHandler的定义

    然后我们可以想象,在Swift方面,我们有这样一个类:

    @objc class IAPBridge : NSObject {
        public typealias ProductsRequestCompletionHandler = (Bool, [SKProduct]?) -> Void
        @objc func requestProducts(_ ch:ProductsRequestCompletionHandler) {
            let products : [SKProduct]? = // whatever
            ch(true, products)
        }
    }
    
    在Objective-C端,类的.m文件必须导入隐式生成的桥接头:

    #import "MyApp-Swift.h" // or whatever it is called
    
    在您的Objective-C类学生眼中,IAPBridge有以下方法:

    - (void)requestProducts:(SWIFT_NOESCAPE void (^ _Nonnull)(BOOL, NSArray<SKProduct *> * _Nullable))ch;
    
    -(void)requestProducts:(SWIFT\u NOESCAPE void(^\u Nonnull)(BOOL,NSArray*\u Nullable))ch;
    
    所以现在你可以称之为:

    IAPBridge* b = [[IAPBridge alloc] init];
    [b requestProducts:^(BOOL success, NSArray<SKProduct *> * products) {
        if (success) {
            NSLog(@"Thank you for the products! They are %@", products);
        } else {
            NSLog(@"%@", @"Darn, something went wrong");
        }
    }];
    
    IAPBridge*b=[[IAPBridge alloc]init];
    [b请求产品:^(BOOL success,NSArray*产品){
    如果(成功){
    NSLog(@“感谢您的产品!它们是%@”,产品);
    }否则{
    NSLog(@“%@”,“该死,出了点问题”);
    }
    }];
    
    根据您的规范,此部分是不可能的:

    productsRequestCompletionHandler?(true, products)
    
    如果ProductsRequestCompletionHandler只接受一个值,则不能返回两个值。因此,您必须修改ProductsRequestCompletionHandler的定义

    然后我们可以想象,在Swift方面,我们有这样一个类:

    @objc class IAPBridge : NSObject {
        public typealias ProductsRequestCompletionHandler = (Bool, [SKProduct]?) -> Void
        @objc func requestProducts(_ ch:ProductsRequestCompletionHandler) {
            let products : [SKProduct]? = // whatever
            ch(true, products)
        }
    }
    
    在Objective-C端,类的.m文件必须导入隐式生成的桥接头:

    #import "MyApp-Swift.h" // or whatever it is called
    
    在您的Objective-C类学生眼中,IAPBridge有以下方法:

    - (void)requestProducts:(SWIFT_NOESCAPE void (^ _Nonnull)(BOOL, NSArray<SKProduct *> * _Nullable))ch;
    
    -(void)requestProducts:(SWIFT\u NOESCAPE void(^\u Nonnull)(BOOL,NSArray*\u Nullable))ch;
    
    所以现在你可以称之为:

    IAPBridge* b = [[IAPBridge alloc] init];
    [b requestProducts:^(BOOL success, NSArray<SKProduct *> * products) {
        if (success) {
            NSLog(@"Thank you for the products! They are %@", products);
        } else {
            NSLog(@"%@", @"Darn, something went wrong");
        }
    }];
    
    IAPBridge*b=[[IAPBridge alloc]init];
    [b请求产品:^(BOOL success,NSArray*产品){
    如果(成功){
    NSLog(@“感谢您的产品!它们是%@”,产品);
    }否则{
    NSLog(@“%@”,“该死,出了点问题”);
    }
    }];
    
    你似乎已经知道答案了,那么你能解释到底还有什么问题吗?你似乎已经知道答案了,那么你能解释到底还有什么问题吗?