TestsTested | ✓ |
LangLanguage | SwiftSwift |
License | MIT |
ReleasedLast Release | Nov 2016 |
SwiftSwift Version | 3.0 |
SPMSupports SPM | ✓ |
Maintained by Roy Marmelstein.
ObjectiveKit provides a Swift friendly API for a set of powerful Objective C runtime functions.
To use ObjectiveKit:
Import ObjectiveKit at the top of your Swift file:
import ObjectiveKit
The next step is to create an ObjectiveClass object typed for the class you want to modify or introspect:
let viewClass = ObjectiveClass<UIView>()
If using ObjectiveKit on a custom Swift class, make sure that it inherits at some point from NSObject and that it is exposed to the Objective C runtime using the @objc flag.
You can learn more about classes at runtime with these handy introspection methods:
let mapViewClass = ObjectiveClass<MKMapView>()
let ivars = mapViewClass.ivars // An array of ivars.
let selectors = mapViewClass.selectors // An array of selectors.
let properties = mapViewClass.properties // An array of properties.
let protocols = mapViewClass.protocols // An array of protocols.
Add a pre-existing selector from another class to your ObjectiveClass:
let viewClass = ObjectiveClass<UIView>()
viewClass.addSelector(#selector(testSelector), from: self.classForCoder)
let view = UIView()
view.perform(#selector(testSelector))
Add a custom method by providing the implementation with a closure:
let viewClass = ObjectiveClass<UIView>()
viewClass.addMethod(closureName, implementation: {
print("hello world")
})
let view = UIView()
view.performMethod(closureName)
ObjectiveKit also supports exchanging selectors in the same class:
let viewClass = ObjectiveClass<UIView>()
viewClass.exchangeSelector(#selector(UIView.layoutSubviews), with: #selector(UIView.xxx_layoutSubviews))
Lastly, you can also create a custom ObjC class at runtime:
let runtimeClass = RuntimeClass(superclass: UIView.self)
runtimeClass.addIvar(ivarName, type: .Float)
let runtimeObject = runtimeClass.allocate()
runtimeObject.setValue(4.0, forKey: ivarName)