Swift将AnyObject转换为Block

所以我使用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)) 

到目前为止这个工作正常。 但是,现在我正在尝试为此代码构建unit testing。 我为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;