在Objective-C中,NSObject
有一个名为load
的类方法,在第一次加载类时会调用它。 Swift中的等价物是什么?
@implementation MyClass
+ (void)load
{
[self registerClass];
}
@end
答案 0 :(得分:22)
自己找到它,将问题保持打开以防其他人正在寻找
override class func load() {
NSLog("sdfsdf");
}
修改强>
从Swift 1.2开始,您无法再覆盖load
方法。查看方法initialize
,它的行为与加载不同,它是第一次在某个地方引用类而不是在应用程序初始加载时调用
答案 1 :(得分:11)
在Swift 1.2中删除了对覆盖负载的支持
答案 2 :(得分:1)
虽然Swift没有直接等效功能,但可以通过Objective-C和类别相对优雅地实现。 MyClass
仍然应该继承自NSObject
,并且有一个类/静态swiftyLoad
方法,该方法可以从MyClass.m
中的Objective-C调用,它包含在MyClass.swift
旁边的编译源中1}}:
# MyClass.swift
import Foundation
public class MyClass: NSObject
{
@objc public static func swiftyLoad() {
Swift.print("Rock 'n' roll!")
}
}
# MyClass.m
#import "MyProject-Swift.h"
@implementation MyClass (private)
+ (void)load { [self swiftyLoad]; }
@end
最好的部分是没有必要混淆桥接标题或其他任何东西,它只是有效。有几个问题,特别是在静态库中使用这种方法时,请查看Medium上的完整post以获取详细信息! ✌️
答案 3 :(得分:0)
我迅速得出了1.2〜5种可行方法的结论:
Doable |swift-load |swift-initialze|bridgeToOC-load|bridgeToOC-initialze|
--- |---- |--- |--- |--- |
swift1.2~4.2|X |O |O |O |
swift4.2~5.0|X |X |O |O |
swift5.0~? |X |X |X |O |
以及如何制作?在这里检查
https://medium.com/post-mortem/using-nsobjects-load-and-initialize-from-swift-f6f2c6d9aad0
但是我认为这是使其变得更快的另一种方法。使用运行时和协议,而无需加载/初始化。
http://jordansmith.io/handling-the-deprecation-of-initialize/
答案 4 :(得分:0)
Swift中的等效项是什么?
没有。
与存储实例属性不同,必须始终为存储类型属性赋予默认值。这是因为类型本身没有可在初始化时将值分配给存储的type属性的初始化程序。
来源:Apple的“ The Swift Programming Language ”
类型在Swift中根本没有初始化程序。如此处的几个答案所示,您可以通过使用Objective-C桥并从NSObject
继承Swift类或使用Objective-C加载器引导程序代码来解决此问题,但是如果您有100% Swift项目,您基本上只有两个选择:
class MyCoolClass {
static func initClass ( ) {
// Do your init stuff here...
}
}
// Somewhere in a method/function that is guaranteed to be called
// on app startup or at some other relevant event:
MyCoolClass.initClass()
class MyCoolClass {
private static var classInitialized: Bool = {
// Do your init stuff here...
// This code will for sure only run once!
return true
}()
private static func ensureClassIsInitialized ( ) {
_ = self.classInitialized
}
func whateverA ( ... ) {
MyCoolClass.ensureClassIsInitialized()
// Do something...
}
func whateverB ( ... ) {
MyCoolClass.ensureClassIsInitialized()
// Do something...
}
func whateverC ( ... ) {
MyCoolClass.ensureClassIsInitialized()
// Do something...
}
}
这遵循一种干净的模式,即Swift中没有代码“自动地”运行,只有在其他代码指示其运行时代码才运行,这提供了清晰且可跟踪的代码流。
对于特殊情况,可能会有更好的解决方案,但您尚未提供有关为什么需要该功能的任何信息。
答案 5 :(得分:-1)
在Swift 2.0中,请使用此方法
public override class func initialize()
答案 6 :(得分:-1)
对于 Swift 2或3 (即后Swift 1.2),您可以使用:
class MySwiftClass: NSObject {
internal override class func initialize() {
DoStuff()
super.initialize()
}
}
但是,正如您所看到的,您的类需要(直接或间接)继承NSObject。这是必需的,因为ObjC运行时调用initialize()
。
只有在引用initialize()
时才会调用MySwiftClass
方法。所以它不会像load()
那样神奇。
但它也会更安全。例如:包括一个框架(比方说,只需将其添加到您的Podfile
)将不允许框架在您的应用程序启动后神秘地开始行为,而无需添加单行代码到你的项目(至少......我希望!)。