Swift 3.1 中的 CocoaTouch 类

Posted

技术标签:

【中文标题】Swift 3.1 中的 CocoaTouch 类【英文标题】:Swizzling CocoaTouch class in Swift 3.1 【发布时间】:2017-03-30 13:35:53 【问题描述】:

我在 XCode 8.3 中使用 Swift 3.1 并看到该警告:

方法'initialize()'定义了Objective-C类方法'initialize', 不能保证被 Swift 调用并且将被禁止 在未来的版本中

我使用Swizzling CocoaTouch class 并且对该部分有疑问:

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

如何重写那部分代码?

open override class func initialize()

修复新警告?

我看到了link,但我不明白如何在我的代码中使用信息。

【问题讨论】:

Swift 3.1 deprecates initialize(). How can I achieve the same thing?的可能重复 【参考方案1】:

我有同样的问题并解决它。

我的解决方案

1。将 swizzling() 方法从 private 更改为 public

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。删除 extension UIViewController 处的 initialize() 方法

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

3。在 AppDelegate::didFinishLaunchingWithOptions 添加 swizzling()

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 

    // some code

    swizzling(UIViewController.self)

    return true

这是简单/容易的解决方案。 (这不优雅)

如果您想获得更多信息,请参阅: Swift 3.1 deprecates initialize(). How can I achieve the same thing?

【讨论】:

以上是关于Swift 3.1 中的 CocoaTouch 类的主要内容,如果未能解决你的问题,请参考以下文章

Swift:通过 Bridging-Header 文件导入时找不到 CorePlot-CocoaTouch.h 文件

将 swift 文件添加到 xCode 中的新视图控制器? (简单的)

添加分享按钮 - Swift

swift 4继承了啥

在 Swift 3.1 中将自己的对象数组添加到 UserDefaults 时出错

《从零开始学Swift》学习笔记(Day 63)——Cocoa Touch设计模式及应用之单例模式