Swift, Objective-C, load-Methode der Klasse?
In Objective-C, NSObject
hatte eine Klasse Methode namens load
aufgerufen wird, wenn die Klasse zum ersten mal geladen. Was ist das äquivalent in Swift?
@implementation MyClass
+ (void)load
{
[self registerClass];
}
@end
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand es selbst, lassen die Frage offen, falls jemand anderes suchen
EDIT:
Als der Swift 1.2 kann man nicht mehr überschreiben, die
load
Methode. Schauen Sie in die Methodeinitialize
statt, es verhält sich anders, als Belastung, obwohl, es heißt das erste mal die Klasse verwiesen wird, irgendwo, anstatt auf die Anwendung initial loadNSObject
.@objc
Klasse; nicht unbedingt der Abstieg ausNSObject
.override
auch).import Foundation @objc class MyClass { class func load() { println("sdfsdf") } }
@objc
; es scheint, dass die Methode@objc
ist genug.extension
s.internal override class func initialize() { }
für ein NSObject Unterklasse. Fand ich nichtinitialize()
zu dürfen, die in einem reinen Swift-Objekt.initialize
ist nicht zulässig, Swift mehr.Unterstützung für das überschreiben von Last entfernt wurde, in Swift 1.2
Während die direkte Entsprechung ist nicht mit Swift, erreicht werden kann dies relativ elegant mit Objective-C und Kategorien.
MyClass
sollte noch Erben vonNSObject
und haben eine Klasse /staticswiftyLoad
- Methode, die aufgerufen wird von Objective-C inMyClass.m
, die Sie in kompilieren von Quellen nebenMyClass.swift
:Den besten Teil gibt es keine Notwendigkeit zu Chaos mit den bridging-Header oder etwas anderes, es funktioniert einfach. Es gibt einige Fallstricke, insbesondere wenn mit diesem Ansatz in statische Bibliotheken, check out die komplette post auf Mittleren details! ✌️
NSObject
noo 🙁Swift 2.0, verwenden Sie Bitte diese Methode
@objc
jedoch.Für Swift 2 oder 3 (d.h. post-Swift-1.2), die Sie verwenden können:
Aber, wie Sie sehen können, muss Ihre Klasse zu Erben (direkt oder indirekt) form NSObject. Dies ist erforderlich, da die
initialize()
ist als die ObjC-runtime.Und die
initialize()
Methode wird nur aufgerufen werden, wennMySwiftClass
verwiesen wird. So wird es nicht als Magie alsload()
.Aber es wird auch sicherer sein. Zum Beispiel: einschließlich Rahmen (sagen wir, nur durch Sie es zu Ihrem
Podfile
) nicht zulassen, wird der Rahmen auf mysteriöse Weise beginnen sich zu Verhalten hat, sobald Ihr die app startet, ohne die Notwendigkeit, fügen Sie eine einzige Zeile code zu Ihrem Projekt (zumindest... hoffe ich! ?).