5 // Created by CHEN Xian’an on 1/17/16.
6 // Copyright © 2016 lazyapps. All rights reserved.
9 import ObjectiveC.runtime
11 let imageItemIdetifier = "\u{FEFF}\u{200B}"
13 let blockIdentifierPrefix = "_menuitemkit_block_"
15 func setNewIMPWithBlock<T>(_ block: T, forSelector selector: Selector, toClass klass: AnyClass) {
16 let method = class_getInstanceMethod(klass, selector)
17 let imp = imp_implementationWithBlock(unsafeBitCast(block, to: AnyObject.self))
18 if !class_addMethod(klass, selector, imp, method_getTypeEncoding(method!)) {
19 method_setImplementation(method!, imp)
23 @nonobjc extension NSObject {
25 var imageBox: Box<UIImage?> {
26 let key: StaticString = #function
27 return associatedBoxForKey(key, initialValue: nil)
30 var actionBox: Box<MenuItemAction?> {
31 let key: StaticString = #function
32 return associatedBoxForKey(key, initialValue: nil)
35 func associatedBoxForKey<T>(_ key: StaticString, initialValue: @autoclosure () -> T) -> Box<T> {
36 guard let box = objc_getAssociatedObject(self, key.utf8Start) as? Box<T> else {
37 let box = Box(initialValue())
38 objc_setAssociatedObject(self, key.utf8Start, box as AnyObject, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)