作为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_implementationWithBlock
types的参数AnyObject!
如何将()->()
转换成AnyObject
?
我试图把它像这样handler as AnyObject
: handler 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