2014-11-04 134 views
2

因此,我使用Salesforce SDK併爲整個SDK構建了橋接標頭。Swift將AnyObject轉換爲塊

它們提供了一個沒有翻譯成最可用代碼的塊語法。例如,

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方法的第二個參數。我想把它變成一個閉包,所以我可以在我的模擬方法中調用它並傳入一些假數據。

+0

我有同樣的isuue – fnc12 2014-12-23 14:57:03

回答

2

來處理這種情況的最好方法是創建自己的typealias爲您塊:

typealias MyFunBlock = @objc_block (dataResponse :AnyObject!) -> Void; 

然後,你可以用它來unsafebitcast:

var block: MyFunBlock = unsafeBitCast(completeBlock, MyFunBlock.self) as MyFunBlock; 
+0

尼斯建議。很容易錯過包裝/解開選項的角色。這使得跟蹤代碼更好。 – 2015-08-17 16:48:19