繁体   English   中英

在Swift中将IMP转换为func

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM