В Objective-C, NSObject
был метод класса, называемый load
, который вызывается, когда класс загружается в первый раз. Что эквивалентно в Swift?
@implementation MyClass
+ (void)load
{
[self registerClass];
}
@end
В Objective-C, NSObject
был метод класса, называемый load
, который вызывается, когда класс загружается в первый раз. Что эквивалентно в Swift?
@implementation MyClass
+ (void)load
{
[self registerClass];
}
@end
Найденный сам, оставит вопрос открытым в случае, если кто-то ищет
override class func load() {
NSLog("sdfsdf");
}
EDIT:
С Swift 1.2 вы больше не можете переопределять метод load
. Посмотрите на метод initialize
вместо этого, он ведет себя иначе, чем загрузка, хотя он вызван в первый раз, когда класс ссылается где-то, а не на начальную загрузку приложения
Поддержка переопределения нагрузки была удалена в Swift 1.2
В то время как прямой скрипт недоступен для Swift, это можно сделать относительно элегантно с помощью Objective-C и категорий. MyClass
должен по-прежнему наследовать от NSObject
и иметь метод class/static swiftyLoad
, который вызывается из Objective-C в MyClass.m
, который вы включаете в источники компиляции вместе с MyClass.swift
:
# 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
Лучшая часть там не нужно возиться с перемычками заголовков или чем-то еще, она просто работает. Есть несколько исправлений, особенно при использовании этого подхода в статических библиотеках, ознакомьтесь с полным post на Medium для деталей! ✌️
в Swift 2.0, используйте этот метод
public override class func initialize()
Для Swift 2 или 3 (т.е. post-Swift 1.2) вы можете использовать:
class MySwiftClass: NSObject {
internal override class func initialize() {
DoStuff()
super.initialize()
}
}
Но, как вы можете видеть, ваш класс должен наследовать (прямо или косвенно) форму NSObject. Это необходимо, потому что initialize()
вызывается средой выполнения ObjC.
И метод initialize()
вызывается только при ссылке MySwiftClass
. Таким образом, это не будет столь же волшебным, как load()
.
Но это будет также безопаснее. Например: включая фреймворк (скажем, просто добавив его в ваш Podfile
), не позволит таинственным образом начать ведение себя, как только ваше приложение запустится, без необходимости добавлять одну строку кода к вашему проект (по крайней мере... надеюсь... 😉).