Objective-C声明了一个类函数initialize(),它在每个类被使用之前运行一次。它经常被用作交换方法实现(方法混淆)等操作的入口点。它在Swift 3.1中已被弃用。
这是我以前做的事情:
extension NSView {
public override class func initialize() {
// This is called on class init and before `applicationDidFinishLaunching`
}
}
如何在不使用initialize
的情况下实现相同的功能?
我需要用于框架,因此需要在AppDelegate中调用某些内容是不可行的。我需要在applicationDidFinishLaunching
之前调用它。
我非常喜欢这个解决方案。 它正是我想要的,但它是针对iOS的。 我需要macOS版本。 有人能提供一个macOS版本吗?
具体而言,我需要类似于以下内容的macOS版本:
extension UIApplication {
private static let runOnce: Void = {
// This is called before `applicationDidFinishLaunching`
}()
override open var next: UIResponder? {
UIApplication.runOnce
return super.next
}
}
我尝试了覆盖NSApplication
的各种属性,但都没有成功。
解决方案必须是纯Swift编写的,不能使用Objective-C。
UIApplication
替换为NSApplication
怎么样? - CristikapplicationDidFinishLaunching
之前调用它,然而 Objective-C 的initialized
并不能保证在applicationDidFinishLaunching
之前被调用,所以也许你正在寻找其他东西。 - CristikNSView
在应用程序完成启动之前被创建;这是常见的,但并不保证)。如果您可以控制 NIB 文件或NSApplicationMain
,则此问题很容易解决,而无需使用任何诡计。如果使用 ObjC 文件,这个问题也很容易解决(甚至不需要 Objective-C 桥接;您只需将 ObjC 文件直接放入项目中即可)。不清楚为什么您把所有简单的方法都排除在外,并且不清楚您的约束条件是什么。 - Rob Napierinitialize()
行为,还是只需要在appDidFinishLaunching
之前执行代码的方法? - Cristik