因此,我使用 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 服务返回的模拟“数据”来模拟completeBlock:参数。
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 方法的第二个参数提供闭包“类型”。我想将它变成一个闭包,这样我就可以在我的模拟方法中调用它并传递一些假数据。