在swift中使用Objective-C块

时间:2016-11-07 08:20:50

标签: ios objective-c swift closures objective-c-blocks

我的swift项目中有第三方Objective-C库,其中一个.h文件中有一个typedef

typedef void (^YDBlutoothToolContectedList) (NSArray *);

在课堂内,它有一个属性:

@property (nonatomic, copy) YDBlutoothToolContectedList blutoothToolContectedList;

(请忽略其拼写)

当我尝试在我的swift类中使用此属性时,我使用

bt.blutoothToolContectedList = {(_ tempArray: [Any]) -> Void in
    self.devices = tempArray
    self.tableView.reloadData()
}

我得到错误说:

Cannot assign value of type '([Any]) -> Void' to type 'YDBlutoothToolContectedList!'

我知道swift中的上述Objective-C代码将是:

typealias YDBlutoothToolContectedList = () -> Void

但是我无法重写Objective-C文件并且swift无法转换闭包类型,有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:12)

typedef void (^YDBlutoothToolContectedList) (NSArray *);

映射到Swift为

public typealias YDBlutoothToolContectedList = ([Any]?) -> Swift.Void

因为closure参数可以是nil。 (你可以验证一下 选择.h文件,然后在Xcode菜单中选择 Navigate-> Jump to Generated Interface 。)

因此, 正确的任务将是

bt.blutoothToolContectedList = {(_ tempArray: [Any]?) -> Void in
    // ...
}

或者只是让编译器推断出参数类型:

bt.blutoothToolContectedList = { tmpArray in
    // ...
}

如果,您可以为Objective-C定义添加可空性注释:

typedef void (^YDBlutoothToolContectedList) (NSArray  * _Nonnull );

然后它将被映射到Swift as

public typealias YDBlutoothToolContectedList = ([Any]) -> Swift.Void