https://steipete.me/posts/2019/swizzling-in-swift