【发布时间】:2018-02-28 12:23:18
【问题描述】:
Objective-C 声明了一个类函数,initialize(),它在使用之前为每个类运行一次。它通常用作交换方法实现(swizzling)等的入口点。它在 Swift 3.1 中已被弃用。
这是我以前做的:
extension NSView {
public override class func initialize() {
// This is called on class init and before `applicationDidFinishLaunching`
}
}
如果没有initialize,我如何实现同样的目标?
我需要它作为一个框架,所以要求在 AppDelegate 中调用某些东西是不行的。我需要在applicationDidFinishLaunching 之前调用它。
我真的很喜欢this 解决方案。这正是我正在寻找的,但它适用于 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怎么样? -
@SindreSorhus 也许你可以给我们一些你试图实现的具体例子。否则问题有点宽泛。
-
你说你需要在
applicationDidFinishLaunching之前调用它,但是不能保证在applicationDidFinishLaunching之前调用Objective-C的initialized,所以也许你正在寻找别的东西。 -
您提供的解决方案并不完全符合您的要求。它们碰巧是靠运气工作的,而且并不健壮(例如,您打赌在应用程序完成启动之前创建了一个
NSView;很常见,但没有承诺)。如果您可以控制 NIB 文件或NSApplicationMain,则无需任何技巧即可轻松解决此问题。使用 ObjC 文件很容易解决(甚至不需要 Objective-C 桥;您可以直接在项目中放置一个 ObjC 文件)。目前尚不清楚您为什么要放弃所有琐碎的方法以及您的限制是什么。 -
@SindreSorhus 快速提问 - 你真的需要相同的
initialize()行为,还是只需要一种在appDidFinishLaunching之前执行代码的方法?