由於Swift2你可以用良好的OLE':如何在Swift中調用IMP?
class_getMethodImplementation(cls: AnyClass!, _ name: Selector) -> IMP
它返回imp
。在Objective-C
你只需要調用它像:
implementation(self, selector)
但如何調用它斯威夫特?
由於Swift2你可以用良好的OLE':如何在Swift中調用IMP?
class_getMethodImplementation(cls: AnyClass!, _ name: Selector) -> IMP
它返回imp
。在Objective-C
你只需要調用它像:
implementation(self, selector)
但如何調用它斯威夫特?
基於文章Instance Methods are Curried Functions in Swift它是很容易達到預期的效果:
typealias MyCFunction = @convention(c) (AnyObject, Selector) -> Void
let curriedImplementation = unsafeBitCast(implementation, MyCFunction.self)
curriedImplementation(self, selector)
稍後會檢查。謝謝! – orkenstein
@orkenstein你可能不得不改變'typealias'的類型,因爲我不知道你需要什麼。 –
我試圖讓運行時調用的實例方法與參數(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!"
sayHiTo(obj,sel,「Lou」) –
你想達到什麼目的?也許你可以使用[實例方法在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。 –
@MartinR非常有用的文章!謝謝。 我正在實現一些UIView的子類。我想跳過它的'超級' 'updateConstaints',因爲它會影響我自己的佈局。所以我的想法:獲得'super.super'實現並調用它。 – orkenstein