在swift中使用Objective-C块

Sen*_*ULL 7 closures objective-c ios objective-c-blocks swift

我的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()
}
Run Code Online (Sandbox Code Playgroud)

我得到错误说:

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

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

typealias YDBlutoothToolContectedList = () -> Void

但我无法重写那个Objective-C文件和swift无法转换关闭类型,有没有可能的方法来解决这个问题?

Mar*_*n R 12

typedef void (^YDBlutoothToolContectedList) (NSArray *);
Run Code Online (Sandbox Code Playgroud)

映射到Swift as

public typealias YDBlutoothToolContectedList = ([Any]?) -> Swift.Void
Run Code Online (Sandbox Code Playgroud)

因为closure参数可以nil.(您可以通过选择.h文件,然后在Xcode菜单中选择Navigate-> Jump to Generated Interface来验证.)

因此,正确的任务将是

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

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

bt.blutoothToolContectedList = { tmpArray in
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

typedef void (^YDBlutoothToolContectedList) (NSArray  * _Nonnull );
Run Code Online (Sandbox Code Playgroud)

那么它将被映射到Swift as

public typealias YDBlutoothToolContectedList = ([Any]) -> Swift.Void
Run Code Online (Sandbox Code Playgroud)