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 中的新视图控制器? (简单的)