gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 11:41:22 27 4
gpt4 key购买 nike

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

  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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com