[英]Convert IMP to a func in Swift
我正在嘗試在我的代碼中執行此操作:
typealias voidIMP = (NSObject, Selector, String) -> ()
let string = NSMutableString()
var selector = Selector("setString:")
var setStringMethod: IMP = string.methodForSelector("setString:")
let callBack = Unmanaged.fromOpaque(setStringMethod).takeUnretainedValue() as AnyObject as! voidIMP
for _ in 0..<1000 {
callBack(string, selector, "stuff")
}
但是應用程序在第5行中崩潰,並顯示EXC_BAD_INSTRUCTION
錯誤。
如何在Swift中使用IMP
? 我試圖將IMP(setStringMethod)
轉換為func
,但是沒有用。 Objective-C版本工作正常。
有兩種方法可以實現此目的。 第一個相當不安全,它使用位轉換,並且基於您的示例:
typealias setStringIMP = @convention(c) (NSObject, Selector, String) -> Void
let string = NSMutableString()
let selector = Selector("setString:")
let callback = unsafeBitCast(string.methodForSelector(selector), setStringIMP.self)
callback(string, selector, "stuff")
請注意@convention(c)
在typealias
-這告訴你typealiasing C函數編譯器。
但是,如果您只想將方法用作回調,則由於方法是一流的函數 ,您可以執行以下操作:
let string = NSMutableString()
let callback = string.setString
callback("stuff")
這比使用不安全的位轉換要安全得多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.