Подтвердить что ты не робот

Swift - метод класса нагрузки Objective-C?

В Objective-C, NSObject был метод класса, называемый load, который вызывается, когда класс загружается в первый раз. Что эквивалентно в Swift?

@implementation MyClass

+ (void)load
{
   [self registerClass];
}

@end
4b9b3361

Ответ 1

Найденный сам, оставит вопрос открытым в случае, если кто-то ищет

override class func load() {
   NSLog("sdfsdf");
}

EDIT:

С Swift 1.2 вы больше не можете переопределять метод load. Посмотрите на метод initialize вместо этого, он ведет себя иначе, чем загрузка, хотя он вызван в первый раз, когда класс ссылается где-то, а не на начальную загрузку приложения

Ответ 2

Поддержка переопределения нагрузки была удалена в Swift 1.2

Ответ 3

В то время как прямой скрипт недоступен для 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 для деталей! ✌️

Ответ 4

в Swift 2.0, используйте этот метод

    public override class func initialize()

Ответ 5

Для 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), не позволит таинственным образом начать ведение себя, как только ваше приложение запустится, без необходимости добавлять одну строку кода к вашему проект (по крайней мере... надеюсь... 😉).