将Swift中的AnyObject转换为Block

3

我正在使用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方法的第二个参数提供闭包“类型”。我想将其转换为闭包,以便在我的模拟方法中调用它并传入一些虚假数据。


我有相同的问题。 - fnc12
1个回答

3
最好的处理方法是为您的块创建自己的typealias:
 typealias MyFunBlock = @objc_block (dataResponse :AnyObject!) -> Void;

然后你可以使用该方法进行不安全位转换:
var block: MyFunBlock = unsafeBitCast(completeBlock, MyFunBlock.self) as MyFunBlock;

不错的建议。在包装/解包选项时很容易漏掉一个字符,这使得在代码中跟踪变得更加美好。 - Sandy Chapman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接