To make swizzling more robust, it would be ideal if the return/argument types of the swizzled implementation could be checked against the original method.
As for how to do that… I guess the only way would be to accept an Objective-C method (via target/selector parameters) instead of an Objective-C block?