2017-11-28 6 views
0

私の質問は、スウィズルする方法についてではなく、この特定のコードスニペットで何が起こっているのか:スウィフト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がデータを送信する。

+1

次にコメントしてください。ニーズは、モデルとして使用したコードのニーズとは異なります。あなたはすでに答えを知っているように見えるので、質問が何であるか不明です! – matt

+0

@matt私が見たすべての素早い例は、この行を持っているように思われるので、それにはいくつかの意味があります。それは私が理解しようとしているものです –

+0

私はそうでなければすべてのUIViewController viewWillAppearは問題のサブクラスに関係なくswizzledされると信じています...私はなぜこれが当てはまるのか理解できませんが。私はこれがSwift 4で動作するかどうかはわかりませんが – kos

答えて

2

あなたが見てきた例は、これがクラスinitializeのメソッドで行われた時から来ているようです。チェックする必要があるか、同じコードを複数回実行することができます(サブクラスが最初に使用されました)、これはあなたのうねりをすでにうっとりさせる方法になります。

しかし、initializeの方法はSwiftでは許可されていないため、その行は適用されません。

関連する問題