Swift编译器之迷惑行为二

在 App 工程中通过 Cocoapods 引入一个自己的 Swift 业务库 Pod1,该库中有一个 Swift 类服从一个 OC 的协议并实现了部分方法,例如:

open class AppDelegate : NSObject, UIApplicationDelegate {  
    open func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        return true
    }
}

然后,在主工程中,继承自 AppDelegate 实现一个新类和新方法:

class CustomAppDelegate : AppDelegate {  
    func applicationDidBecomeActive(_ application: UIApplication) {

    }
}

如果 Pod1 使用的是源码引入,一切正常;如果 Pod1 使用的是打包好的静态库 Pods1.xcframework,发现 applicationDidBecomeActive(:) 方法进不来了。原因是 respondsToSelector:@selector(applicationDidBecomeActive:) 返回 false,也就是说,在 CustomAppDelegate 类下的方法 applicationDidBecomeActive(:) 不再是动态派发,而是静态派发了!

同样的代码,引入源码和静态库就造成这样的差异,着实很迷。

目前只能手动添加 @objc 标记解决这个编译兼容问题:

class CustomAppDelegate : AppDelegate {  
    @objc
    func applicationDidBecomeActive(_ application: UIApplication) {

    }
}

已经提了相关 issue 到苹果官方。