gpt4 book ai didi

objective-c - 在 swift/objective-c 中以多个参数作为参数的 block

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

我正在尝试将 Swift 函数(具有多个参数,定义为闭包)传递给 Objective-C 函数。从技术上讲,该函数是在 Objective-C++ 中定义的,但我在 header 级别遇到了一个问题,因此对于这个问题它应该是等价的。

在 Objective-C header 中,我将其定义为:

@interface MyObjCClass : NSObject
typedef void (^MyCallback)(NSMutableData*, int);

- (void) functionThatTakesACallback: (MyCallback) callback;

在 swift 中,我尝试以这种方式使用它:

self.objcclass!.functionThatTakesACallback()
{
(values: NSMutableData, length: Int32) -> Void in
// Do something with this data.
}

我得到的错误是:

Cannot convert value of type '(NSMutableData, Int32) -> Void' to expected argument type 'MyCallback!'

如果我稍微展开一下,将 block 直接放入 Objective-C 函数定义(无 typedef):

- (void) functionThatTakesACallback: (void (^)(NSMutableData*, int)) callback;

它给了我更多的帮助:

Cannot convert value of type '(NSMutableData, Int32) -> Void' to expected argument type '((NSMutableData!, Int32) -> Void)!'

那么,从本质上讲,有什么方法可以解开这个闭包以适应预期的类型吗?还是重新定义 Objective-C 类型?

最佳答案

我认为您需要将可空性属性添加到回调参数和函数的回调参数中。有两种方法可以做到这一点。

将可空性注释添加到每个需要它的地方。

@interface MyObjCClass : NSObject
typedef void (^MyCallback)(nonnull NSMutableData*, int);

- (void) functionThatTakesACallback: (nonnull MyCallback) callback;

设置整个文件为非空

NS_ASSUME_NONNULL_BEGIN

@interface MyObjCClass : NSObject
typedef void (^MyCallback)(NSMutableData*, int);

- (void) functionThatTakesACallback: (MyCallback) callback;

@end

NS_ASSUME_NONNULL_END

关于objective-c - 在 swift/objective-c 中以多个参数作为参数的 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35588469/

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