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

标签 ios swift

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

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

  2. 在我的 Obj-C 类中调用我的 Swift 类

IAPbridge = [[IAPBridge alloc] init];
[IAPbridge requestProducts];
  1. 我有一门swift课
public func requestProducts ()  {

}
  1. 我的 Obj-C 类应该有一个 block 来从 Swift 类接收一些数据

  2. 应该是这样的(这段代码是错误的,但是我觉得应该是这样的)

objective-C

[IAPbridge requestProducts:^(id *products) {
    NSLog(@"Response:%@", products);
}];

swift

public typealias ProductsRequestCompletionHandler = (_ products: [SKProduct]?) -> Void
private var productsRequestCompletionHandler: ProductsRequestCompletionHandler?    

public func requestProducts (completionHandler)  {
    productsRequestCompletionHandler = completionHandler
    productsRequestCompletionHandler?(true, products)
}

那么,有什么帮助吗?

最佳答案

按照您的规范,这部分是不可能的:

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 文件必须导入隐式生成的桥接 header :

#import "MyApp-Swift.h" // or whatever it is called

在您的 Objective-C 类眼中,IAPBridge 具有以下方法:

- (void)requestProducts:(SWIFT_NOESCAPE void (^ _Nonnull)(BOOL, NSArray<SKProduct *> * _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");
    }
}];

关于ios - 如何将带有回调的 Objective-C 传递给 Swift 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53565567/

相关文章:

ios - UITableView 中的数据在特定情况下不会刷新

ios - 使用 Swift 3.0 编译的模块无法在 Swift 2.3 中导入

ios - 通用闭包的 Swift 数组?

ios - 从解析中拉出对象后如何从 parse.com 对象访问其他属性/列(swift)

ios - Google Calendar API 在返回 recurringEventId 时 swift 返回 recurrence = nil

ios - 将 Unity 嵌入 iOS 自己的 ViewController 中

ios - 如何从我的 NetworkingService 响应访问我的 HomeViewController 中的用户属性?

iphone - xcode swift - 将文本格式化为电话号码

ios - SVRevealViewController 与顶部布局指南的偏移量有误

iOS Firebase Facebook 因 URL 错误而失败