Ich beginne mein Projekt mit einem Split View Controller als Initial View Controller und starte es automatisch vom Storyboard aus.
Im Allgemeinen hat eine App mit dieser Benutzeroberfläche nur einen Split-View-Controller als Root. Daher erstelle ich eine statische Variable in der Unterklasse und lege sie fest, wenn die Initialisierung abgeschlossen ist.
Also möchte ich dieses Verhalten schnell ausprobieren.
Ich habe das Swift-Programmiersprachenhandbuch auf iBook über Typeigenschaften (mit statischem Schlüsselwort und Klassenschlüsselwort) gelesen und versucht, einen Code für den Job zu finden:
import UIKit
class SplitViewController: UISplitViewController {
class func sharedInstance() -> SplitViewController {
return SplitViewController.instance
}
class let instance: SplitViewController = nil
init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
self.initialization()
}
init(coder aDecoder: NSCoder!) {
super.init(coder: aDecoder);
self.initialization()
}
func initialization() {
SplitViewController.instance = self;
}
}
Aber ich habe herausgefunden, wann Xcode sagt, dass das Klassenschlüsselwort für Typeneigenschaften noch nicht unterstützt wird.
Hattest du eine Lösung dafür?
Antworten:
Swift unterstützt jetzt statische Variablen in Klassen. Dies ist nicht genau das Gleiche wie eine Klassenvariable (da sie nicht von Unterklassen geerbt werden), aber es bringt Sie ziemlich nahe:
quelle
class
Schlüsselwort jetzt nur für berechnete Eigenschaften verwendet werden, und statisch gilt für alle Typeneigenschaften (in Aufzählung, Klasse) oder Struktur)Das Einbetten einer Struktur kann als Problemumgehung problemlos funktionieren:
Die berechnete Typ-Eigenschaft SomeClass.workaroundClassVariable kann dann so verwendet werden, als wäre sie eine gespeicherte Typ-Eigenschaft.
quelle
Es scheint möglich zu sein, Variablen mit statischer Speicherdauer im Dateibereich zu deklarieren (wie in C):
quelle
private
.Meine bevorzugte Methode besteht darin, nur eine private Dateibereichsvariable außerhalb der Klasse zu verwenden und dann klassen- / statische Getter und Setter zu implementieren:
quelle
Ab Swift 1.2 (verfügbar mit Xcode 6.3b1 und höher) werden
static
Klasseneigenschaften und -methoden unterstützt.quelle
class
Variable nur veraltet ist, oder gibt es eine Unterscheidung (früherstatic
für Strukturen,class
für Klassen)?static
ein Alias für istclass final
.Verwenden eines dispatch_once-Singleton-Modells in Swift
Scheint die bisher beste Antwort zu sein, wobei die Verwendung einer globalen Variablen vermieden wird.
quelle
Eine Lösung, die im Dateibereich ähnlich wie var ist, jedoch anpassbarer und in der Nähe von Singleton ist, besteht darin, eine Struktur zu verwenden, die statische var als Eigenschaft der Klasse unterstützt
quelle
Ok, mit der Lösung von Nikolai, die die Arbeit macht. Ich poste meine Änderungen in diesem Thread zur Information
In meinem appDelegate kann ich beispielsweise auf diese statische Methode zugreifen
quelle
Der Wortlaut des Fehlers impliziert stark, dass dies in Zukunft ein Sprachmerkmal sein wird.
Möglicherweise möchten Sie vorübergehend eine Eigenschaftsvariable im Anwendungsdelegierten deklarieren und von dort abrufen. Nicht ideal, definitiv ein Anti-Muster, aber es würde Ihnen einen zentralen Ort geben, an dem Sie das
UISplitViewController
bei Bedarf abrufen können.quelle
Sie müssen die Klassenvariablen in eine innere Strukturvariable einschließen
quelle
Versuche dies:
quelle
In Swift heißt es Type Property .
Lesen Sie mehr unter dem Link unten,
https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html#//apple_ref/doc/uid/TP40014097-CH14-ID254
quelle