我的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无法转换闭包类型,有没有办法解决这个问题?
答案 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