簡體   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