我正在使用Salesforce SDK,并为整个SDK构建了桥接头文件。
它们提供了一种块语法,但未能转化为最易用的代码。例如,
func sendRESTRequest(request: SFRestRequest!, failBlock: SFRestFailBlock!, completeBlock: AnyObject!)
完整块是AnyObject!。我能够通过以下方式解决此问题:
var block : @objc_block (dataResponse :AnyObject!) -> Void = { dataResponse in //I handle the response}
restService.sendRESTRequest(request, failBlock: { (error :NSError!) -> Void in
}, completeBlock: unsafeBitCast(block, AnyObject.self))
目前这个工作良好。但是,现在我正在尝试为这个代码构建单元测试。我已经为SFRestAPI创建了一个模拟类,这是函数“sendRESTRequest”所在的类。为了进行测试,我正在尝试通过传递模拟“数据”来模拟完整块:参数,该参数将从REST服务返回。
class MockSFRestAPI : SFRestAPI {
override func sendRESTRequest(request: SFRestRequest!, failBlock: SFRestFailBlock!, completeBlock: AnyObject!) {
//Convert complete block into a closure and pass in some test data
}
}
问题在于,我无法将AnyObject!强制转换为一个块,就像我可以将块转换为AnyObject一样。
我尝试过以下几种方法:
var block = completeBlock as @objc_block (AnyObject! -> Void)
var block2: (AnyObject! -> Void) = unsafeBitCast(completeBlock, (@objc_block (AnyObject! -> Void)))
尝试过很多次,但这两种方法似乎是比较理智的。那么,在Swift中是否可能呢?问题似乎在于我不能为unsafeBitCast方法的第二个参数提供闭包“类型”。我想将其转换为闭包,以便在我的模拟方法中调用它并传入一些虚假数据。