2016-11-16 101 views
3

我不得不a trick幫助測試UIAlertController,在斯威夫特2.X工作:如何在Swift 3中將__NSMallocBlock__轉換爲其基礎類型?

extension UIAlertController { 

    typealias AlertHandler = @convention(block) (UIAlertAction) -> Void 

    func tapButtonAtIndex(index: Int) { 
     let block = actions[index].valueForKey("handler") 
     let handler = unsafeBitCast(block, AlertHandler.self) 

     handler(actions[index]) 
    } 

} 

這不履行斯威夫特3.X與fatal error: can't unsafeBitCast between types of different sizes,這誘惑我相信有可能是一種方法,使演員的工作。任何人都可以弄明白嗎?

回答

7

發現,在斯威夫特3.0.1

extension UIAlertController { 

    typealias AlertHandler = @convention(block) (UIAlertAction) -> Void 

    func tapButton(atIndex index: Int) { 
     if let block = actions[index].value(forKey: "handler") { 
      let blockPtr = UnsafeRawPointer(Unmanaged<AnyObject>.passUnretained(block as AnyObject).toOpaque()) 
      let handler = unsafeBitCast(blockPtr, to: AlertHandler.self) 
      handler(actions[index]) 
     } 
    } 

} 

有效的解決方案(最初,block值實際塊,而不是一個指針塊,你顯然不能轉換爲指針,以AlertHandler

+0

非常有幫助,謝謝! – xytor

0

如果您的UIAlertController是一個操作表,您可以在執行處理程序之前修改Robert的答案以關閉UIAlertController。

駁回(動畫:真,完成:{()中的處理程序(self.actions [指數])})

我用此擴展的測試和無該變形例我的斷言爲呈現視圖控制器進行故障。

相關問題