作为AnyObject的Swiftclosures

我试图使用这个方法: class_addMethod()在Obj-c中是这样使用的:

 class_addMethod([self class], @selector(eventHandler), imp_implementationWithBlock(handler), "v@:"); 

而且我在Swift中使用它就像这样:

 class_addMethod(NSClassFromString("UIBarButtonItem"), "handler", imp_implementationWithBlock(handler), "v@:") 

这是UIBarButtonItem的扩展,你可能已经想通了。

imp_implementationWithBlock需要一个imp_implementationWithBlocktypes的参数AnyObject!

如何将()->()转换成AnyObject

我试图把它像这样handler as AnyObjecthandler as AnyObject但它给了我一个错误,说:( ()->() does not conform to protocol 'AnyObject'

如何将()->()转换成AnyObject

警告 :这个答案包括Swift中的无证和不安全的function。 我怀疑这通过AppStore审查。

 let f: ()->() = { println("test") } let imp = imp_implementationWithBlock( unsafeBitCast( f as @objc_block ()->(), AnyObject.self ) ) 

你可以写一个包装,然后传递给函数

 class ObjectWrapper<T> { let value :T init(value:T) { self.value = value } } let action = ObjectWarpper(value: {()->() in // something }) 

你不能。 你只能将它投射到Any

  • AnyObject可以表示任何类types的实例。
  • Any可以表示任何types的实例,包括函数types。

苹果公司“Swift编程语言”,iBooks。 https://itun.es/de/jEUH0.l

在Swift 2中,你应该使用@convention而不是@objc_block 。 请参见types属性

 func swizzle(type: AnyClass, original: Selector, methodType: MethodType, block: () -> Void) { let originalMethod = method(type, original: original, methodType: methodType) let castedBlock: AnyObject = unsafeBitCast(block as @convention(block) () -> Void, AnyObject.self) let swizzledImplementation = imp_implementationWithBlock(castedBlock) // More code goes here } 

这对我有效:

 let myBlock: @objc_block () -> Void = { } var mf : AnyObject = unsafeBitCast(myBlock, AnyObject.self) 

使用Any对象(所有types隐式符合的协议)

  let aBlock: (view: View) -> Void = { view in /**/ } let block:Any? = aBlock