Package for interception of objc selectors in Swift.
Observe selectors on NSObject instances
import Interception
navigationController.setInterceptionHandler(
for: _makeMethodSelector(
selector: UINavigationController.popViewController,
signature: navigationController.popViewController
)
) { result in
print(result.args) // `animated` flag
print(result.output) // popped `UIViewController?`
}You can also simplify creating method selector with InterceptionMacros if you are open for macros
import InterceptionMacros
navigationController.setInterceptionHandler(
for: #methodSelector(UINavigationController.popViewController)
) { result in
print(result.args) // `animated` flag
print(result.output) // popped `UIViewController?`
}Macros require
swift-syntaxcompilation, so it will affect cold compilation time
You can set up multiple interception handlers as well, just make sure that you use different keys for each handler
import Intercexption
object.setInterceptionHandler(
for: _makeMethodSelector(
selector: #selector(MyObject.someMethod(arg1:arg2)),
signature: MyObject.someMethod(arg1:arg2)
),
key: "argumentsPrinter"
) { result in
// In case of multiple arguments
// you can access them as a tuple
print(result.args.0)
print(result.args.1)
}import InterceptionMacros
object.setInterceptionHandler(
for: #methodSelector(MyObject.someMethod(arg1:arg2)),
key: "argumentsPrinter"
) { result in
// In case of multiple arguments
// you can access them as a tuple
print(result.args.0)
print(result.args.1)
}If you use it to create a library it may be a good idea to export custom selectors implicitly
// Exports.swift
@_exported import _InterceptionCustomSelectorsAlso you may find some @_spi methods and Utils helpful
@_spi(Internals) import Interception
import _InterceptionUtils // Is not shown in the autocompleteSee combine-interception for usage example.
You can add Interception to an Xcode project by adding it as a package dependency.
- From the File menu, select Swift Packages › Add Package Dependency…
- Enter
"https://github.com/capturecontext/swift-interception.git"into the package repository URL text field - Choose products you need to link them to your project.
If you use SwiftPM for your project, you can add CombineInterception to your package file.
.package(
url: "https://github.com/capturecontext/swift-interception.git",
.upToNextMinor(from: "0.2.0")
)Do not forget about target dependencies:
.product(
name: "Interception",
package: "swift-interception"
).product(
name: "InterceptionMacros",
package: "swift-interception"
)This library is released under the MIT license. See LICENCE for details.
See ACKNOWLEDGMENTS for inspiration references and their licences.