2015-09-09 81 views
3

由於Swift2你可以用良好的OLE':如何在Swift中調用IMP?

class_getMethodImplementation(cls: AnyClass!, _ name: Selector) -> IMP 

它返回imp。在Objective-C你只需要調用它像:

implementation(self, selector) 

但如何調用它斯威夫特

+0

你想達到什麼目的?也許你可以使用[實例方法在Swift中是Curried函數]的事實(http://oleb.net/blog/2014/07/swift-instance-methods-curried-functions/)?請參閱http://stackoverflow.com/questions/28345950/swift-get-reference-to-a-function-with-same-name-but-different-parameters。 –

+0

@MartinR非常有用的文章!謝謝。 我正在實現一些UIView的子類。我想跳過它的'超級' 'updateConstaints',因爲它會影響我自己的佈局。所以我的想法:獲得'super.super'實現並調用它。 – orkenstein

回答

7

基於文章Instance Methods are Curried Functions in Swift它是很容易達到預期的效果:

typealias MyCFunction = @convention(c) (AnyObject, Selector) -> Void 
let curriedImplementation = unsafeBitCast(implementation, MyCFunction.self) 
curriedImplementation(self, selector) 
+0

稍後會檢查。謝謝! – orkenstein

+0

@orkenstein你可能不得不改變'typealias'的類型,因爲我不知道你需要什麼。 –

3

我試圖讓運行時調用的實例方法與參數(S)工作。 @法比奧的回答讓我獲得了大部分途徑。以下是未來Google的完整示例:

import Foundation 

class X { 
    @objc func sayHiTo(name: String) { 
    print("Hello \(name)!") 
    } 
} 

let obj = X() 
let sel = #selector(obj.sayHiTo) 
let meth = class_getInstanceMethod(object_getClass(obj), sel) 
let imp = method_getImplementation(meth) 

typealias ClosureType = @convention(c) (AnyObject, Selector, String) -> Void 
let sayHiTo : ClosureType = unsafeBitCast(imp, ClosureType.self) 
sayHiTo(obj, sel, "Fabio") 
// prints "Hello Fabio!" 
+1

sayHiTo(obj,sel,「Lou」) –

相關問題