因此,我正在使用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方法的第二个参数提供闭包“类型”。我想将其转换为闭包,以便可以在我的模拟方法中调用它并传递一些虚假数据。
解决这种情况的最佳方法是为您的代码块创建自己的类型别名:
typealias MyFunBlock = @objc_block (dataResponse :AnyObject!) -> Void;
然后,您可以将其用于unsafebitcast:
var block: MyFunBlock = unsafeBitCast(completeBlock, MyFunBlock.self) as MyFunBlock;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句