私の質問は、スウィズルする方法についてではなく、この特定のコードスニペットで何が起こっているのか:スウィフト4 +スウィズルviewWillAppear()
private let swizzling: (UIViewController.Type) ->() = { viewController in
let originalSelector = #selector(viewController.viewWillAppear(_:))
let swizzledSelector = #selector(viewController.proj_viewWillAppear(animated:))
let originalMethod = class_getInstanceMethod(viewController, originalSelector)
let swizzledMethod = class_getInstanceMethod(viewController, swizzledSelector)
method_exchangeImplementations(originalMethod, swizzledMethod) }
extension UIViewController {
open override class func initialize() {
// make sure this isn't a subclass
guard self === UIViewController.self else { return }
swizzling(self)
}
// MARK: - Method Swizzling
func proj_viewWillAppear(animated: Bool) {
self.proj_viewWillAppear(animated: animated)
let viewControllerName = NSStringFromClass(type(of: self))
print("viewWillAppear: \(viewControllerName)")
}
}
このコード狙撃はこちらから:Swizzling CocoaTouch class
私が持っている質問は次のコード行です:
// make sure this isn't a subclass
guard self === UIViewController.self else { return }
なぜ私たちはUIViewControllerのサブクラスではないかどうかを確認する必要がありますか?私のシナリオでは、ビュー名を持つ分析データをOmnitureに送信したいと考えています(これまでのviewWillAppearでは)。私がチェックをするとスウィズリングはうまくいかないが、私がこのラインをコメントアウトすると、私は望みの結果を得て、すべてのView Controllerがデータを送信する。
次にコメントしてください。ニーズは、モデルとして使用したコードのニーズとは異なります。あなたはすでに答えを知っているように見えるので、質問が何であるか不明です! – matt
@matt私が見たすべての素早い例は、この行を持っているように思われるので、それにはいくつかの意味があります。それは私が理解しようとしているものです –
私はそうでなければすべてのUIViewController viewWillAppearは問題のサブクラスに関係なくswizzledされると信じています...私はなぜこれが当てはまるのか理解できませんが。私はこれがSwift 4で動作するかどうかはわかりませんが – kos