[英]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.