2015-12-02 83 views
1

我試圖做到這一點在我的代碼:轉換IMP的FUNC斯威夫特

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版本工作正常。

回答

1

還有兩種方式來實現這一點。第一個,而是不安全的,利用位鑄造,並根據您的例子:

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") 

這是安全得多比使用不安全位數據。

+0

@convention(c)就像一個魅力。 – wj2061