Clase Swizzling CocoaTouch en Swift 3.1

Utilizo Swift 3.1 en XCode 8.3 y veo esa advertencia:

El método 'initialize ()' define el método de class Objective-C 'initialize', que Swift no garantiza que invocará y será rechazado en futuras versiones

Utilizo la class Swizzling CocoaTouch y tengo un problema con esa parte:

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)") } } 

¿Cómo reescribir esa parte del código?

 open override class func initialize() 

¿Para corregir una nueva advertencia?

Vi ese enlace , pero no entiendo cómo usar la información en mi código.

Tuve el mismo problema y lo solucioné.

Mi solución

1. Cambia el método swizzling () al público de privado

 public let swizzling: (AnyClass, Selector, Selector) -> () = { forClass, originalSelector, swizzledSelector in let originalMethod = class_getInstanceMethod(forClass, originalSelector) let swizzledMethod = class_getInstanceMethod(forClass, swizzledSelector) method_exchangeImplementations(originalMethod, swizzledMethod) } 

2. Eliminar el método initialize () en la extension UIViewController

 // open override class func initialize() { // // make sure this isn't a subclass // guard self === UIViewController.self else { return } // swizzling(self) // } 

3. Agregue swizzling () en AppDelegate :: didFinishLaunchingWithOptions

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // some code swizzling(UIViewController.self) return true } 

Esta es simplemente una solución sencilla. (esto no es elegante)

Si desea get más información, consulte esto: Swift 3.1 desatesting la initialization (). ¿Cómo puedo lograr lo mismo?